|
#1
|
|||
|
|||
пауза в потоке
драсте подскажите как сделать шоб поток в определеном месте остановился
а в нужный момент команда с основнова процеса сняла этот поток с паузы |
#2
|
||||
|
||||
CreateEvent, WaitForSingleObject.
Пишу программы за еду. __________________ |
#3
|
|||
|
|||
а можно по подробнее про WaitForSingleObject
потому што у меня в отдельном потоке уже стоит эта команда там пауза вызвана через SetWaitableTimer а здесь оно должно остановиться и ждать событий компа |
#4
|
||||
|
||||
Oops, про SetEvent забыл упомянуть.
Пишу программы за еду. __________________ |
#5
|
||||
|
||||
Цитата:
Код:
TMonitor.Wait() — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#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 имеет фундаментальный изъян Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. Последний раз редактировалось 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
|
||||
|
||||
Так написали же уже.
Цитата:
Цитата:
Цитата:
jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 12.02.2017 в 17:30. |
#15
|
||||
|
||||
Монитора-то не хватает для решения задачи? Там нет этих танцев (точнее, они скрыты от программиста).
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |