Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2011, 20:26   #11
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Господа это теория, было бы неплохо посмотреть на код. Он интересует не только хозяина темы, а и меня, для общего развития. Буду благодарен.
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 25.09.2011, 20:42   #12
Pamparam
Форумчанин
 
Регистрация: 08.11.2009
Сообщений: 225
По умолчанию

почему я тогда могу выполнять в это же время другие процедуры в которых нет задержки (delay) и рекурсии?
Pamparam вне форума Ответить с цитированием
Старый 25.09.2011, 20:53   #13
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Почему выполнение первой останавливается, пока не выполнится вторая?
Хороший вопрос учитывая что
Цитата:
The PostMessage function places (posts) a message in the message queue associated with the thread that created the specified window and then returns without waiting for the thread to process the message.
А еще у меня вопрос - как ты умудрился замерить задержку? Неужели код внутри представленной процедуры так долго выполняется?

P.S. Хотя думаю ответ на этот вопрос заключается в твоей procedure Delay(dwMilliseconds: Longint);
I'm learning to live...

Последний раз редактировалось Stilet; 25.09.2011 в 20:55.
Stilet вне форума Ответить с цитированием
Старый 25.09.2011, 21:07   #14
Silver_S
Форумчанин
 
Регистрация: 14.03.2011
Сообщений: 104
По умолчанию

Цитата:
выполнение первой останавливается, пока не выполнится вторая
У вас рекурсия, вторая никогда не закончит выполнение.

Цитата:
почему я тогда могу выполнять в это же время другие процедуры
Как бы по-проще выразиться... Вызов Application.ProcessMessages в процедуре Delay заставляет программу проверить наличие других комманд от пользователя и выполнить их, и только тогда продолжить дальнейшее выполнение процедуры. Т. е. вы жмете кнопку 1, запускается код, который никогда не завершится, но периодически проверяет команды от пользователя. Тут приходит команда - жать кнопку 2. Код кнопки 1 останавливается, чтоб выполнить код 2. Но код 2 также уходит в рекурсию и не возвращает управление коду 1...
Silver_S вне форума Ответить с цитированием
Старый 25.09.2011, 21:27   #15
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию

поскольку пообещал код вот смотрите

Код:
unit Unit1;

interface

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

type
TNewThread = class(TThread)
  private
    name:string;
    id:byte;
    go:boolean;
  protected
    procedure Execute; override;
  end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Button2: TButton;
    procedure WndProc(var Msg: TMessage); override;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Thread:array[0..1]of TNewThread;
implementation

{$R *.dfm}


procedure TForm1.WndProc(var Msg: TMessage);
begin
  inherited;
if Msg.Msg=wm_user+2 then
form1.Label1.Caption:=inttostr(strtoint(form1.Label1.Caption)+1);
if Msg.Msg=wm_user+3 then
form1.Label1.Caption:=inttostr(strtoint(form1.Label1.Caption)+1);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Thread[0]:=TNewThread.Create(true);
Thread[0].name:='------000-------';
Thread[0].id:=0;
Thread[0].go:=true;
Thread[0].FreeOnTerminate:=true;
Thread[0].Priority:=tpLower;
Thread[1]:=TNewThread.Create(true);
Thread[1].name:='------111-------';
Thread[1].id:=1;
Thread[1].go:=true;
Thread[1].FreeOnTerminate:=true;
Thread[1].Priority:=tpLower;

Thread[0].Resume;
Thread[1].Resume;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Thread[0].go:=false;
Thread[1].go:=false;
Thread[0].Terminate;
Thread[1].Terminate;
end;

{ TNewThread }

procedure TNewThread.Execute;
var Handle:HWND;
begin
  inherited;
Handle:=FindWindow(nil, PChar(name));
if Handle<>0 then
while go do begin
if id=0 then
PostMessage(Handle,WM_USER+2,ord('A'),0);
if id=1 then
PostMessage(Handle,WM_USER+3,ord('A'),0);
sleep(100);
end;
end;

end.
сначала форме дал caption ------000------- откомпилировал переименовал exe и изменил caption на ------111-------, запустил нажал кнопку и на обеих формах начало увеличиваться значение в Label одинаково. ТС возми код за основу и радуйся
fate вне форума Ответить с цитированием
Старый 25.09.2011, 21:30   #16
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
У вас рекурсия, вторая никогда не закончит выполнение.
Не пойму... Де вы там рекурсю надыбали?... В топе то...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.09.2011, 21:32   #17
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию

процедура ahaha вызывает сама себя, кстати она там лишняя если нужно бесконечно слать сообщение проще циклом воспользоваться
fate вне форума Ответить с цитированием
Старый 25.09.2011, 21:32   #18
Silver_S
Форумчанин
 
Регистрация: 14.03.2011
Сообщений: 104
По умолчанию

Код:
procedure ahaha(handl:string);
var handle:thandle;
begin
   
   Handle:=FindWindow(nil, PChar(handl));
PostMessage(Handle,WM_CHAR,ord('A'),0);
    delay(100);
  ahaha(handl); //рекурсия
end;
Silver_S вне форума Ответить с цитированием
Старый 25.09.2011, 21:41   #19
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ага-ага... Теперь увидел. Ну да, тогда понятно что тут в потоки нужно пихать. Но лучше стратегию другую выбрать...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.09.2011, 21:42   #20
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

fate, идею понял, спасибо за пример кода !
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
2 действия одновременно Mr_skiner Общие вопросы Delphi 10 14.05.2011 09:40
одновременное выполнение разных процедур в одном файле? gramp Microsoft Office Excel 15 25.03.2011 12:15
последовательное выполнение процедур в макросе iamaxl Microsoft Office Excel 4 07.07.2009 16:23
Псевдопараллельное выполнение процедур (Потоки) delphin100 Общие вопросы Delphi 4 10.04.2009 20:16