Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

DX: TThread.WaitForSuspended

6 views
Skip to first unread message

Victor Shaclein

unread,
Jan 28, 2004, 3:58:59 AM1/28/04
to
Hi, all

В основной нити пытаюсь добиться следующего:

Thread.Resume;
Thread.WaitForSuspended;

Когда, например, в Thread.Execute вызывается Thread.Suspend,
выполнение основной нити должно продолжиться.

Как реализовать Thread.WaitForSuspended ?
А еще лучше Thread.WaitForSuspended (aTimeOut) ?

Пробовал через переопределение Thread.Suspend и установку флажка,
но while not Thread.Flag do sleep () виснет, кроме того,
уверен, что есть более правильный путь через семафоры,
например. Но как отловить событие по Thread.Suspend ?

Подскажите, pls, коль кто знает.

Успехов,
Виктор

--
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru

Leonid Troyanovsky

unread,
Jan 28, 2004, 7:15:55 AM1/28/04
to
Приветствую, Victor.

> В основной нити пытаюсь добиться следующего:

> Thread.Resume;
> Thread.WaitForSuspended;

SuspendThread(MainThreadId);

> Когда, например, в Thread.Execute вызывается Thread.Suspend,
> выполнение основной нити должно продолжиться.

ResumeThread(MainThreadId);
Suspend;

> Как реализовать Thread.WaitForSuspended ?
> А еще лучше Thread.WaitForSuspended (aTimeOut) ?

MsgWaitForMultipleObjects, например в Application.OnIdle.
Ожидать можно событие (Event), хендл или условленное сообщение.

Если не хочется, что бы приложение делало при ожидании что-то полезное,
то можно поручить ожидание модальной форме:

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm2 = class(TForm)
..
private
{ Private declarations }
ncount : DWord;
FHandles: array [0..MAXIMUM_WAIT_OBJECTS-1] of THandle;
procedure WMUser(var msg: TMessage); message WM_USER;
public
function WaitHandles(const Handles: array of THandle): Longint; virtual;
{ Public declarations }
end;

const
IDWAIT = 256;

implementation

{$R *.DFM}

procedure TForm2.WMUser;
var
waitresult: DWord;
begin
Application.ProcessMessages;
if (ModalResult <> 0) then
Exit;

waitresult := MsgWaitForMultipleObjects( ncount,
FHandles,
False,
INFINITE,
QS_ALLINPUT );

if (waitresult = WAIT_OBJECT_0 + ncount) then
PostMessage(Handle, WM_USER, 0, 0)
else
ModalResult := IDWAIT + waitresult;
end;

function TForm2.WaitHandles;
begin
ncount := High(Handles)-Low(Handles)+1;
Move(Handles[0], FHandles[0], ncount* SizeOf(THandle));
PostMessage(Handle, WM_USER, 0, 0);
Result := ShowModal;
end;
..
end;

Убираем форму из списка автосоздаваемых, а показывать будем так
(ожидаем завершения процесса):

with TForm2.Create(nil) do
try
case WaitHandles([pi.hProcess]) of
IDCANCEL: {форма закрыта кнопкой} ;
..
IDWAIT+WAIT_FAILED: {Ошибка функции ожидания};
..
IDWAIT+WAIT_OBJECT_0: {Сигналит hProcess};
..
end;
finally
Free;
end;

--
С уважением, LVT

0 new messages