Как зациклить proxyList и accountList с потоками, чтобы, пока прокси не был заблокирован, продолжалось тестирование учетных записей?
Во-первых, например, если количество потоков равно 5, проблема в том, что он начинает тестировать accountList с 4 вместо 0. Во-вторых: я получаю дубликаты последнего протестированного аккаунта.
Они определены так:
public partial class Form1 : Form
{
private static int g = 0;
private static int v = 0;
private static int r = 0;
private static int w = 0;
int globalCount = 0;
int failCount = 0;
int successCount = 0;
int freeCount = 0;
int banCount = 0;
int retCount = 0;
int unknownCount = 0;
int proxyCount = 0;
int r = 0, g = 0, v = 0, w = 0;
[ThreadStatic]
private static bool BanProxy = false;
[ThreadStatic]
private static bool DontR = false;
[ThreadStatic]
private static bool Dont = false;
[ThreadStatic]
private static bool Retry = false;
public static List<string> accountLst = new List<string>();
public static List<string> proxyLst = new List<string>();
private void Button2_Click(object sender, EventArgs e)
{
int tCount = Convert.ToInt32(textBox2.Text);
if (checkBox1.Checked)
LoadProxies();
LoadAccounts();
for (int i = 0; i < tCount; i++)
{
var th = new Thread(() => Worker());
th.Start();
}
}
А вот рабочий, из которого, кажется, возникла проблема. Я перепробовал все, что мог придумать безрезультатно.
public void Worker()
{
int j = Thread.CurrentThread.ManagedThreadId;
while (v < accountLst.Count - 1)
{
if (!DontR)
{
proxyCount++;
if (label7.InvokeRequired)
Invoke((MethodInvoker)(() => this.label7.Text = $"pCount : {proxyCount}"));
}
if (r == proxyLst.Count)
{
//Thread.Sleep(timetoretestproxylist);
r = 0;
}
w = r;
if (!DontR)
r++;
do
{
if (!Dont & !Retry)
{
v = g;
g++;
}
if (richTextBox2.InvokeRequired)
Invoke((MethodInvoker)(() => richTextBox2.AppendText($"v: {v}, thread: {j}" + "\n")));
switch (Checker(accountLst[v], proxyLst[w]))
{
case FAIL_KEY:
failCount++;
BanProxy = false;
if (label3.InvokeRequired)
Invoke((MethodInvoker)(() => label3.Text = $"Bad : {failCount}"));
break;
case SUCC_KEY:
successCount++;
BanProxy = false;
Invoke(new MethodInvoker(() =>
{
label1.Text = $"Success : {successCount}";
richTextBox1.AppendText(accountLst[v] + "\n");
}));
break;
case FREE_KEY:
freeCount++;
BanProxy = false;
if (label2.InvokeRequired)
Invoke((MethodInvoker)(() => label2.Text = $"Free : {freeCount}"));
break;
case BAN_KEY:
banCount++;
if (label4.InvokeRequired)
Invoke((MethodInvoker)(() => label4.Text = $"Ban : {banCount}"));
BanProxy = true;
break;
case RET_KEY:
retCount++;
Retry = true;
break;
default:
unknownCount++;
BanProxy = false;
if (label7.InvokeRequired)
Invoke((MethodInvoker)(() => label5.Text = $"Unknown : {unknownCount}"));
break;
}
if (Retry)
{
DontR = true;
break;
}
if (BanProxy)
{
Dont = true;
break;
}
globalCount++;
Invoke((MethodInvoker)(() =>
{
richTextBox2.AppendText(accountLst[v] + "\n");
label6.Text = $"Total : {globalCount}/{accountLst.Count}";
}));
DontR = false;
Dont = false;
} while (v < accountLst.Count - 1);
}
}
BanProxy и Retry выключены или включены в контролере.