Hello all) Есть одна небольшая проблемка, собственно имеется многопоточный чекер прокси, свой собственный. Но не могу прикрутить к нему паузу и стоп. Кто и что может посоветовать, помимо глобальных переменных типа Stop, Pause. у меня почему-то они не захотели работать
SuspendThread - поставить поток на паузу ResumeThread - снять с паузы TerminateThread - убить. Для них подходит хендл который возвращает CreateThread. Но это будет не правильно если ты убьешь поток то ресурсы под хендлы сокетов заюзанные не освободятся Или же через эвенты делать всё. Создаешь эвент без автоустановки событий. Далее в цикле проверки делаешь WaitForSingleObject на хендл этого эвента. А когда надо поставить паузу то сбрасываешь его состояние, когда надо возобновить работу - выставляешь его состояние. А вообще через глобальные потоки переменные и код типа в потоке: while (GlobalStop) Sleep(пауза); А чтобы поставить на паузу то просто ставишь GlobalStop не равным нулю.
одним из лёгких это наверное пока, что глобалки) но что-то они не хотят быть добры ко мне Это конечно крутые процедурки: SuspendThread - поставить поток на паузу ResumeThread - снять с паузы TerminateThread - убить. НО когда вот такое объявление то они не айс пашут) Code: ... var // глобальная объява ThrCheckProxy : array [1..100] of TThreadChekerProxy; ... // Вызываеться при помощи клика for I:=1 to SEThreadValue.Value do begin ThrCheckProxy[i] := TThreadChekerProxy.Create(False); ThrCheckProxy[i].FreeOnTerminate := True; ThrCheckProxy[i].OnTerminate := EnabledChekerProxy; end; end; Как я понял, если глобалки делать, то надо делать примерно так: Code: while Pause do begin Synchronize(procedure begin Pause := PauseChek; // PauseChek глобальная end); Sleep(500); end; но дело в том, что такое не особо хочет пахать :О
где в потоке?! с формой в потоке не айс работать при потоках 20-30(( Что значит просто синхронизировать. P.S. я еще не до конца в потоках разобрался. так что прошу хоть пример какой нить)
CRITICAL_SECTION хотя бы.Тебе надо упорядочить доступ потоков к оющим (глобальным) данным,что б не было коллизий доступа и соответсвенно глюков типа крашей и зависаний.Правда для синхронизации ещё можно встроенными средствами VCL воспользоватся(это по хорошему).Но по скольку прокси врядли будут откликатся быстрее гуя,то можно и на секциях замутить.Хотя атцы могут орать что это быдлокодинг ,работать все будет
Что бы остановить поток, делаешь в нем проверки: Что бы приостановить работу потока: Что бы возобновить работу потока: И да, смешивать WinAPI (то, что посоветовал slesh) с TThread не советую. P.S. _nic, при чем тут крит. секции?
Прежде тем задать вопрос показал бы сорцы а так дар телепатизма хромает =\ а так пользуйся или создай свою событию онпаус
Если я не Ошибаюсь то при запуске 100 потоков, таким кодом 100 не остановить: Code: ThrCheckProxy[i].Suspend; & ThrCheckProxy[i].Resume; Возможно я очень дико ошибаюсь но по-моему я как то пробовал и не получилось. Code: Application.ProcessMessages; try except ты этим кодом тормозишь 20-100 потоков? Ну пример кода я привёл, а свой чекер как бы не хочется кому то подарить, что люди которые могут ответить в этом посте не могут написать чекер? я думаю могу и написали уже, причем не один, а школоте выкладывать не хочется, пусть книжки читают на переменах про Delphi. P.S. Чтож всем спасибо за то, что откликнулись) аж на две странице в посте будем пробовать при наличии свободного времени!
Умно) а теперь как быть, если pause : boolean; объявлена глобально, и есть 20 потоков то сразу полетят ошибки! А если внутри потока то такой код лол while pause do sleep(1000); -> это бесконечный код в которой Pause не получил значение глобальной переменной ПАУЗЫ быть точнее! P.S. Вроде бы всё так!
Мона попробовать сделать так. 1. Объявить переменную в классе потока (FPause, например) 2. Создать процедуру в потоке: Code: procedure GetPause; begin FPause := GlobalPause; end; 3. После в потоке делать следующую проверку: Code: ... Synchronize(GetPause); while FPause do sleep(1000); ...
Как так не получилось? Кидаешь кнопку на форму, свойство Caption:='PAUSE'; дальше сам код кнопки: Code: procedure TForm1.Button1Click(Sender: TObject); var k: integer; begin if (Button1.Caption='PAUSE') then begin Button1.Caption:='RESUME'; for k:=0 to ThreadCount do ThrCheckProxy[k].Suspend; end else begin Button1.Caption:='PAUSE'; for k:=0 to ThreadCount do ThrCheckProxy[k].Resume; end; end;
у тебя такой код работает? у меня ошибка вылетает просто как бы) проверка лол просто) надо Suspended проверять, а не "if (Button1.Caption='PAUSE') then"