[Delphi] Stop/Pause Thread

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Kandi, 12 Nov 2010.

  1. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Hello all)
    Есть одна небольшая проблемка, собственно имеется многопоточный чекер прокси, свой собственный. Но не могу прикрутить к нему паузу и стоп. Кто и что может посоветовать, помимо глобальных переменных типа Stop, Pause. у меня почему-то они не захотели работать :D
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    SuspendThread - поставить поток на паузу
    ResumeThread - снять с паузы
    TerminateThread - убить.
    Для них подходит хендл который возвращает CreateThread. Но это будет не правильно если ты убьешь поток то ресурсы под хендлы сокетов заюзанные не освободятся

    Или же через эвенты делать всё. Создаешь эвент без автоустановки событий. Далее в цикле проверки делаешь
    WaitForSingleObject на хендл этого эвента.
    А когда надо поставить паузу то сбрасываешь его состояние, когда надо возобновить работу - выставляешь его состояние.

    А вообще через глобальные потоки переменные и код типа в потоке:
    while (GlobalStop) Sleep(пауза);
    А чтобы поставить на паузу то просто ставишь GlobalStop не равным нулю.
     
    #2 slesh, 12 Nov 2010
    Last edited: 12 Nov 2010
  3. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    одним из лёгких это наверное пока, что глобалки) но что-то они не хотят быть добры ко мне :D

    Это конечно крутые процедурки:
    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;
    
    но дело в том, что такое не особо хочет пахать :О
    :confused:
     
  4. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Топорно мыслишь :( Надо просто синхронизировать потоки.
     
  5. shell_c0de

    shell_c0de Hack All World

    Joined:
    7 Jul 2009
    Messages:
    1,051
    Likes Received:
    615
    Reputations:
    690
    Создай процедуру Pause и примерно
     
    _________________________
  6. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    где в потоке?! с формой в потоке не айс работать при потоках 20-30((

    Что значит просто синхронизировать.

    P.S. я еще не до конца в потоках разобрался. так что прошу хоть пример какой нить)
     
  7. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    CRITICAL_SECTION хотя бы.Тебе надо упорядочить доступ потоков к оющим (глобальным) данным,что б не было коллизий доступа и соответсвенно глюков типа крашей и зависаний.Правда для синхронизации ещё можно встроенными средствами VCL воспользоватся(это по хорошему).Но по скольку прокси врядли будут откликатся быстрее гуя,то можно и на секциях замутить.Хотя атцы могут орать что это быдлокодинг :D ,работать все будет :D
     
  8. HakaR

    HakaR Active Member

    Joined:
    23 Jul 2009
    Messages:
    301
    Likes Received:
    200
    Reputations:
    3
    Что бы остановить поток, делаешь в нем проверки:
    Что бы приостановить работу потока:

    Что бы возобновить работу потока:

    И да, смешивать WinAPI (то, что посоветовал slesh) с TThread не советую.
    P.S. _nic, при чем тут крит. секции?
     
  9. [stranger]

    [stranger] Member

    Joined:
    2 Feb 2010
    Messages:
    167
    Likes Received:
    29
    Reputations:
    4
    синхронизация
     
  10. HakaR

    HakaR Active Member

    Joined:
    23 Jul 2009
    Messages:
    301
    Likes Received:
    200
    Reputations:
    3
    [offtop] Название треда читал? Где там написано о синхронизации? [/offtop]
     
    #10 HakaR, 13 Nov 2010
    Last edited: 13 Nov 2010
  11. shell_c0de

    shell_c0de Hack All World

    Joined:
    7 Jul 2009
    Messages:
    1,051
    Likes Received:
    615
    Reputations:
    690
    Прежде тем задать вопрос показал бы сорцы а так дар телепатизма хромает =\
    а так пользуйся

    или создай свою событию онпаус
     
    _________________________
  12. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Если я не Ошибаюсь то при запуске 100 потоков, таким кодом 100 не остановить:
    Code:
    ThrCheckProxy[i].Suspend;
    
    &
    
    ThrCheckProxy[i].Resume;
    
    Возможно я очень дико ошибаюсь но по-моему я как то пробовал и не получилось.

    Code:
    Application.ProcessMessages;
    try
    except
    ты этим кодом тормозишь 20-100 потоков? :D

    Ну пример кода я привёл, а свой чекер как бы не хочется кому то подарить, что люди которые могут ответить в этом посте не могут написать чекер? я думаю могу и написали уже, причем не один, а школоте выкладывать не хочется, пусть книжки читают на переменах про Delphi.

    P.S. Чтож всем спасибо за то, что откликнулись) аж на две странице в посте :) будем пробовать при наличии свободного времени!
     
  13. 090808

    090808 Member

    Joined:
    15 Mar 2009
    Messages:
    171
    Likes Received:
    46
    Reputations:
    10
    pause:boolean;


    В потоке

    while pause do sleep(1000);
     
  14. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Умно) а теперь как быть, если pause : boolean; объявлена глобально, и есть 20 потоков то сразу полетят ошибки!
    А если внутри потока то такой код лол while pause do sleep(1000); -> это бесконечный код в которой Pause не получил значение глобальной переменной ПАУЗЫ быть точнее!

    P.S. Вроде бы всё так! :p
     
  15. GlooK

    GlooK Elder - Старейшина

    Joined:
    20 Apr 2007
    Messages:
    172
    Likes Received:
    53
    Reputations:
    10
    Мона попробовать сделать так.
    1. Объявить переменную в классе потока (FPause, например)
    2. Создать процедуру в потоке:
    Code:
    procedure GetPause;
    begin
    FPause := GlobalPause;
    end;
    
    3. После в потоке делать следующую проверку:
    Code:
    ...
    Synchronize(GetPause);
    while FPause do sleep(1000);
    ...
    
     
  16. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Ещё раз повторяю подход вкорне не верен.Такую задачу нада решать средствами ООП.
     
  17. xmadstyle

    xmadstyle Member

    Joined:
    29 Aug 2008
    Messages:
    91
    Likes Received:
    53
    Reputations:
    24
    Как так не получилось?
    Кидаешь кнопку на форму, свойство 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;
    
     
    #17 xmadstyle, 14 Nov 2010
    Last edited: 14 Nov 2010
  18. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    у тебя такой код работает? :) у меня ошибка вылетает просто как бы)

    проверка лол просто) надо Suspended проверять, а не "if (Button1.Caption='PAUSE') then" :D
     
    #18 Kandi, 14 Nov 2010
    Last edited: 14 Nov 2010
  19. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Проблема решена. Большое спасибо G-Host :)