Форум по программированию Delphi Sources

 


   Сайт  
   Исходники  
   Компоненты  
   Статьи  
   FAQ  
   Поиск по исходникам  
   Футболки  

Вернуться   Форум по программированию Delphi Sources > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.02.2017, 20:44
SKIPtr SKIPtr вне форума
Новичок
 
Регистрация: 15.03.2015
Сообщения: 71
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию пауза в потоке

драсте подскажите как сделать шоб поток в определеном месте остановился
а в нужный момент команда с основнова процеса сняла этот поток с паузы
Ответить с цитированием
  #2  
Старый 08.02.2017, 20:58
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,252
Версия Delphi: 7, 2010, XE5
Репутация: 59585
По умолчанию

CreateEvent, WaitForSingleObject.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 08.02.2017, 21:08
SKIPtr SKIPtr вне форума
Новичок
 
Регистрация: 15.03.2015
Сообщения: 71
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

а можно по подробнее про WaitForSingleObject
потому што у меня в отдельном потоке уже стоит эта команда
там пауза вызвана через SetWaitableTimer
а здесь оно должно остановиться и ждать событий компа
Ответить с цитированием
  #4  
Старый 08.02.2017, 21:19
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,252
Версия Delphi: 7, 2010, XE5
Репутация: 59585
По умолчанию

Oops, про SetEvent забыл упомянуть.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 11.02.2017, 07:47
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,420
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Цитата:
Сообщение от NumLock
CreateEvent, WaitForSingleObject.
Код:
TMonitor.Wait()
Ответить с цитированием
  #6  
Старый 11.02.2017, 08:08
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,252
Версия Delphi: 7, 2010, XE5
Репутация: 59585
По умолчанию

На форме 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  
Старый 11.02.2017, 09:28
SKIPtr SKIPtr вне форума
Новичок
 
Регистрация: 15.03.2015
Сообщения: 71
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
На форме 2 Button и Memo:

спасибо щас попробую
Ответить с цитированием
  #8  
Старый 12.02.2017, 10:15
SKIPtr SKIPtr вне форума
Новичок
 
Регистрация: 15.03.2015
Сообщения: 71
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

попробывал
срабатывает нормально
но тут когда такой вопрос задал мне дали почти похожий совет
только они советовали вместо
Код:
SetEvent(HEvent);

там советовали
Код:
PulseEvent(FEvnt);

оба варианта работают
а в чем разница этих команд
Ответить с цитированием
  #9  
Старый 12.02.2017, 10:20
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,252
Версия Delphi: 7, 2010, XE5
Репутация: 59585
По умолчанию

Цитата:
Сообщение от SKIPtr
там советовали
Код:
PulseEvent(FEvnt);
плохие советчики!
Цитата:
This function is unreliable and should not be used.
PulseEvent
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #10  
Старый 12.02.2017, 12:30
SKIPtr SKIPtr вне форума
Новичок
 
Регистрация: 15.03.2015
Сообщения: 71
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

во нашел
у меня это действие должно каждый раз срабатывать
я поставил бесконечный цикл
при SetEvent когда происходит это событие оно начинает непрерывно это выполнять
при PulseEvent выполнит один раз и ждет когда опять произойтет это событие
Ответить с цитированием
  #11  
Старый 12.02.2017, 13:38
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 510
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

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  
Старый 12.02.2017, 13:44
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,252
Версия Delphi: 7, 2010, XE5
Репутация: 59585
По умолчанию

Цитата:
Сообщение от SKIPtr
у меня это действие должно каждый раз срабатывать
я поставил бесконечный цикл
при SetEvent когда происходит это событие оно начинает непрерывно это выполнять
неправда! у CreateEvent bManualReset = False.

Код:
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  
Старый 12.02.2017, 17:19
SKIPtr SKIPtr вне форума
Новичок
 
Регистрация: 15.03.2015
Сообщения: 71
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

вот у меня примерно так выглядет

Код:
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  
Старый 12.02.2017, 17:26
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,358
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Так написали же уже.
Цитата:
Сообщение от NumLock
у CreateEvent bManualReset = False.
То есть второй аргумент должен быть FALSE:
Цитата:
Сообщение от MSDN
CreateEvent(
_In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes,
_In_ BOOL bManualReset,
_In_ BOOL bInitialState,
_In_opt_ LPCTSTR lpName
);
А у тебя:
Цитата:
CreateEvent(nil,true,false,nil);
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 12.02.2017 в 17:30.
Ответить с цитированием
  #15  
Старый 13.02.2017, 22:21
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,420
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Монитора-то не хватает для решения задачи? Там нет этих танцев (точнее, они скрыты от программиста).
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:54.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2017

ВКонтакте   Twitter   Facebook