PDA

Просмотр полной версии : Остановить все потоки а потом снова запустить


*Хalyava*
09.12.2012, 20:08
приветствую. столкнулся с проблемой.
в программе нужно ввести капчу. для этого нужно остановить все потоки в программе. останавливается только один, процедурой suspend, остальные продолжают работать тем самым не дают вписать в поле и отправить капчу.
(так как одна капча заменяется другой т.е. из другого потока.)
как мне остановить все потоки разом а потом по нажатию кнопки снова запустить их.

есть условие:

if pos('captcha_code',s1) >0 then
begin
...
co.suspend;
....
end;

metraz
09.12.2012, 20:17
код остановки потока?

*Хalyava*
10.12.2012, 18:20
код остановки потока?

не совсем понимаю что вы хотите от меня услышать :confused:

если вы спрашиваете нужен ли мне код остановки потока, то:

в смысле ? :D какой код:D
мне нужна процедура\функция которая заморозит все потоки разом при условии = true. а потом с помощью кнопки запустит их снова.

Sinyss
10.12.2012, 18:45
Такое нельзя написать не зная имени объекта с потоками, что они делают, откуда планируется вызывать эту функцию...

*Хalyava*
11.12.2012, 14:09
Такое нельзя написать не зная имени объекта с потоками, что они делают, откуда планируется вызывать эту функцию...

функция должна вызывается из процедуры Execute, которая как известно уже описана в классе TMyThread.

происходит post запроса на сервер. дальше проверяется условие . если оно истинное - замораживаем все потоки а дальше уже запускаем их (то же кол-во, С ТОГО ЖЕ МЕСТА) снова по нажатию кнопочки.

Добавлено через 4 часа 55 минут
забыл добавить.

вот эту паузу я делаю для того, что бы ввести капчу и отправить ее на сервер.
если ставить 1 поток:
поток останавливается (использую suspend) я ввожу капчу и отправляю ее.


при нескольких потоках получается вылазиют сразу несколько капч(image на форме только 1). как мне все ввести их по очереди чтобы они соответствовали логину\паролю которому она принадлежит?

metraz
11.12.2012, 20:49
функция должна вызывается из процедуры Execute, которая как известно уже описана в классе TMyThread.

происходит post запроса на сервер. дальше проверяется условие . если оно истинное - замораживаем все потоки а дальше уже запускаем их (то же кол-во, С ТОГО ЖЕ МЕСТА) снова по нажатию кнопочки.

Добавлено через 4 часа 55 минут
забыл добавить.

вот эту паузу я делаю для того, что бы ввести капчу и отправить ее на сервер.
если ставить 1 поток:
поток останавливается (использую suspend) я ввожу капчу и отправляю ее.


при нескольких потоках получается вылазиют сразу несколько капч(image на форме только 1). как мне все ввести их по очереди чтобы они соответствовали логину\паролю которому она принадлежит?

через синхронизацию. и останавливать потоки не надо.

*Хalyava*
12.12.2012, 19:45
спасибо. пробую...
подскажи еще как можно приостановить выполнение процедуры а потом с кнопки ее запустить???

тут такая фигня.
запихал я в синхронизацию код для "доставки" и ввода\отправки капчи в программу, а сама процедура синхронизации работает без остановки что собственно не дает мне возможности ввести и отправить капчу.

metraz
12.12.2012, 21:25
создайте какой нибудь триггер в кнопке, которые выведет синхронизацию из рекурсии и продолжит работу.

*Хalyava*
14.12.2012, 19:06
еще подскажите можно ли задать условие на проверку нажатия кнопки ???

if button1.click then // пример (чтобы понять что мне нужно)

Tip.the.besT
14.12.2012, 19:24
Если ты действительно хочешь остановить потоки (хотя как сказано выше можно синхронизировать, но иногда не лучший вариант, например когда капча вылетает не часто, то умнее будет приостановить), то тебе нужно просто при создание потока загнать их в массив, далее пройтись по массиву циклом и остановить все. Немного кода:

a: array [1..10] of potok;//массив для хранения наших потоков

Создаём потоки, а также добавляем их в массив.

for pot:=1 to 10 do
a[pot]:=potok.Create(false);

Теперь можно манипулировать:
a[1].suspend;
a[1].resume;

metraz
15.12.2012, 15:25
еще подскажите можно ли задать условие на проверку нажатия кнопки ???

if button1.click then // пример (чтобы понять что мне нужно)

у кнопки есть событие onclick