![]() |
|
|
#1
|
|||
|
|||
|
драсте подскажите как сделать шоб поток в определеном месте остановился
а в нужный момент команда с основнова процеса сняла этот поток с паузы |
|
#2
|
||||
|
||||
|
CreateEvent, WaitForSingleObject.
|
|
#3
|
|||
|
|||
|
а можно по подробнее про WaitForSingleObject
потому што у меня в отдельном потоке уже стоит эта команда там пауза вызвана через SetWaitableTimer а здесь оно должно остановиться и ждать событий компа |
|
#4
|
||||
|
||||
|
Oops, про SetEvent забыл упомянуть.
|
|
#5
|
||||
|
||||
|
Цитата:
Код:
TMonitor.Wait() |
|
#6
|
||||
|
||||
|
На форме 2 Button и Memo:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TWaitThread = class(TThread)
private
FMsg: String;
procedure Updt;
protected
procedure Execute; override;
end;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
HEvent: THandle;
implementation
{$R *.dfm}
{ TWaitThread }
procedure TWaitThread.Updt;
begin
Form1.Memo1.Lines.Add(FMsg);
end;
procedure TWaitThread.Execute;
begin
FMsg:='Execute start';
Synchronize(Updt);
FMsg:='WaitForSingleObject';
Synchronize(Updt);
case WaitForSingleObject(HEvent, 5000) of (* INFINITE *)
WAIT_OBJECT_0: begin
FMsg:='WAIT_OBJECT_0';
Synchronize(Updt);
end;
WAIT_TIMEOUT: begin
FMsg:='WAIT_TIMEOUT';
Synchronize(Updt);
end;
end;
FMsg:='Execute stop'+sLineBreak;
Synchronize(Updt);
end;
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
with TWaitThread.Create(True) do
begin
FreeOnTerminate:=True;
Resume;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
SetEvent(HEvent);
end;
initialization
HEvent:=CreateEvent(nil, False, False, nil);
finalization
CloseHandle(HEvent);
end. |
| Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
SKIPtr (11.02.2017)
| ||
|
#7
|
|||
|
|||
|
Цитата:
|
|
#8
|
|||
|
|||
|
попробывал
срабатывает нормально но тут когда такой вопрос задал мне дали почти похожий совет только они советовали вместо Код:
SetEvent(HEvent); там советовали Код:
PulseEvent(FEvnt); оба варианта работают а в чем разница этих команд |
|
#9
|
||||
|
||||
|
Цитата:
Цитата:
|
|
#10
|
|||
|
|||
|
во нашел
у меня это действие должно каждый раз срабатывать я поставил бесконечный цикл при SetEvent когда происходит это событие оно начинает непрерывно это выполнять при PulseEvent выполнит один раз и ждет когда опять произойтет это событие |
|
#11
|
||||
|
||||
|
SetEvent() - Sets the specified event object to the signaled state.
ResetEvent() - Sets the specified event object to the nonsignaled state. ------------------------------------------ PulseEvent() - This function is unreliable and should not be used. It exists mainly for backward compatibility. Вот, кстати, пояснение: PulseEvent имеет фундаментальный изъян Последний раз редактировалось dr. F.I.N., 12.02.2017 в 13:41. |
|
#12
|
||||
|
||||
|
Цитата:
Код:
procedure TWaitThread.Execute;
begin
FMsg:='Execute start';
Synchronize(Updt);
while true do
begin
FMsg:='WaitForSingleObject';
Synchronize(Updt);
case WaitForSingleObject(HEvent, 5000) of (* INFINITE *)
WAIT_OBJECT_0: begin
FMsg:='WAIT_OBJECT_0';
Synchronize(Updt);
end;
WAIT_TIMEOUT: begin
FMsg:='WAIT_TIMEOUT';
Synchronize(Updt);
end;
end;
end;
FMsg:='Execute stop'+sLineBreak;
Synchronize(Updt);
end;каждая итерация будет выполняться только при нажатии на кнопку. могу даже exe выложить. |
|
#13
|
|||
|
|||
|
вот у меня примерно так выглядет
Код:
type
TWaitThread = class(TThread)
ecze: string;
provera : string;
ary : integer;
HTimer: THandle;
procedure Execute; override;
procedure TimerFired(Sender: TObject);
end;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
private
{ Private declarations }
public
{ Public declarations }
Zad : TWaitThread;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Zad := TWaitThread.Create(TRUE);
with Zad do
begin
ecze := fail.Text;
OnTerminate := TimerFired;
FreeOnTerminate := TRUE;
Resume;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
n := Zad.HTimer;
SetEvent(n);
end;
procedure TWaitThread.Execute;
begin
HTimer := CreateEvent(nil,true,false,nil);
try
for n := 0 to 5 do
begin
WaitForSingleObject(HTimer, INFINITE);
WinExec(PChar(ecze), SW_ShowNormal);
end
finally
CloseHandle(HTimer);
end;
end;
end;так команда WinExec(PChar(ecze), SW_ShowNormal); сразу 5 раз запускаеться а мне нужно шоб запускала после каждого нажатия на кнопку |
|
#14
|
||||
|
||||
|
Так написали же уже.
Цитата:
Цитата:
Цитата:
Последний раз редактировалось Bargest, 12.02.2017 в 17:30. |