Конференция "WinAPI" » Альтернатива sleep [D7, WinXP]
 
  • Zuzlan © (01.11.07 00:48) [0]
    Здравствуйте, уважаемые.
    Знаю что тема заезжена, но вот ответа который бы меня устроил я так и не нашел.

    Скажем есть цикл

    while not OK do
    begin
    // {сюда нужно что то, что приостановило бы работу текущего потока, НО не подвесило работу основного процесса (sleep отпадает), не грузило бы процессор под завязку (application.ProcessManager отпадает) и при этом не влияло на работу остальных потоков.}
    end



    Есть у кого то предложения по этому поводу?

    За ранее большое спасибо за _полезные_ ответы!
  • DrPass © (01.11.07 00:51) [1]

    > НО не подвесило работу основного процесса (sleep отпадает),
    >  

    эээ... а какое отношение sleep имеет к основному процес... потоку, ты хотел сказать? Sleep приостанавливает работу того, и только того потока, из которого она была вызвана.
  • Zuzlan © (01.11.07 01:09) [2]

    > Sleep приостанавливает работу того, и только того потока,
    >  из которого она была вызвана.
    >


    хм... а почему тогда форма не двигается, когда sleep применяется в структуре:

    Основновное приложение-->Поток (родитель, от него идет еще ряд потоков)--> Дочерний поток и тут (!) применяется sleep.

    Причем у родительского и у дочерних потоков приоритет стоит tpIdle
  • Zuzlan © (01.11.07 01:23) [3]
    Вот код только что написал, что бы понятнее было... (и при этом подвисает форма основного приложения)



    TMotherThread = class(TThread)
    private
     procedure BeginOfAll;
    protected
     procedure Execute; override;
    end;

    TSonThread = class(TThread)
    private
     procedure BeginSon;
    protected
     procedure Execute; override;
    end;

    var
     Form1: TForm1;
     TMother:TMotherThread;
     TSon:TSonThread;

    implementation

    procedure TMotherThread.Execute;
    begin
    Synchronize(BeginOfAll);
    end;

    procedure TMotherThread.BeginOfAll;
    begin
    TSon.Execute;
    end;

    procedure TSonThread.Execute;
    begin
    Synchronize(BeginSon);
    end;

    procedure TSonThread.BeginSon;
    begin
    Sleep(1000);
    end;

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    TMother:=TMotherThread.Create(true);
    TMother.Priority:=tpIdle;
    TSon:=TSonThread.Create(true);
    TSon.Priority:=tpIdle;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    TMother.Execute;
    end;


  • Zuzlan © (01.11.07 01:42) [4]
    Выяслин, что synhronize, который я использовал - это зло.

    Благодарю за внимание. Тема закрыта
  • Германн © (01.11.07 01:45) [5]

    > Zuzlan ©   (01.11.07 01:23) [3]
    >
    > Вот код только что написал, что бы понятнее было... (и при
    > этом подвисает форма основного приложения)

    Да. Действительно понятнее. Ещё одна жертва Архангельского и его учеников :(((

    Почитай про метод Synchronize. Может поймёшь что-нибудь.
  • Германн © (01.11.07 01:47) [6]

    > Германн ©   (01.11.07 01:45) [5]

    Опоздал. Автор оказался умнее, чем это могло показаться на первый взгляд.
    Только он не прав, говоря что
    > synhronize, который я использовал - это зло.

    Это не зло. Это очень полезная вещь. Только пользоваться ею надо с умом.
  • Германн © (01.11.07 01:49) [7]
    P.S. Кстати и WinAPI тут совершенно не при чём.
  • Джо © (01.11.07 01:50) [8]
    >
    > procedure TSonThread.Execute;
    > begin
    > Synchronize(BeginSon);
    > end;

    Тут все очень просто.
    Процедура, передаваемая параметром в Synchronize, выполняется в контексте основного потока. Оттого и интерфейс «подвисает», ведь он тоже выполняется в основном.
  • Anatoly Podgoretsky © (01.11.07 09:24) [9]
    > Zuzlan  (01.11.2007 01:23:03)  [3]


    procedure TMotherThread.Execute;
    begin
      Synchronize(BeginOfAll);
    end;



    У нас это называют Архангельщина. Так же буть поосторожнее и с Фленовщиной.
 
Конференция "WinAPI" » Альтернатива sleep [D7, WinXP]
Есть новые Нет новых   [134431   +10][b:0][p:0.001]