Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задержка потока 
V
    Опции темы
NoliX
Дата 18.1.2006, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.7.2005

Репутация: нет
Всего: 1



Товарищи, подскажите, как сделать задержку в потоке, я весь форум перерыл, подходящего ничего не нашел...

Сразу оговорюсь такой цикл мне не подходит....

Код

FirstTickCount := GetTickCount64;
  repeat
    Application.ProcessMessages;
//     allowing access to other controls, etc.
    Now := GetTickCount64;
  until (Now - FirstTickCount >= MSecs);


Ttimer тоже не подходит, и sleep не подходит...

В общем суть задачи состоит в том, что необходимо приостановить работу потока из самого потока на n секунд, при этом основное приложение должно нормально работать... (sleep был бы идеален если бы не тормозил всю программу...)

В общем скажите кто, что знает...
Добавлено @ 20:00
ага, так, sleep тормозит поток если у него нету синхронизации, а с синхронизацией как задержку поставить?
--------------------
Опыт - это учитель, который очень дорого берет за свои уроки
PM MAIL   Вверх
Демо
Дата 18.1.2006, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



NoliX

Если у тебя несколько потоков, то Sleep приостанавливает выполнение только того потока, в котором выполняется Sleep.
Опиши понятнее, что ты хочешь сделать.
Добавлено @ 20:10
PS. Не понял, зачем в WINAPI тему? smile


--------------------
    
PM MAIL ICQ Skype   Вверх
NoliX
Дата 18.1.2006, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.7.2005

Репутация: нет
Всего: 1



упс, пардон, темой промахнулся....
Итак есть 2 формы, есть поток, поток вызывается с первой формы и выполняет действия с периодичность в несколько секунд, после того как поток закончил свое черное дело первая форма прячется и появляется вторая форма

Тут 2 подводных камня:
1. Если вызвать поток без синхронизации, то вторая форма не открывается, пишет ошибку, что не верный дескриптор окна
2.Если использовать синхронизацию, то sleep находящийся в потоке подвешивает программу


Вопрос: Что делать?
--------------------
Опыт - это учитель, который очень дорого берет за свои уроки
PM MAIL   Вверх
_hunter
Дата 18.1.2006, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



а почему бы не открывать вторую форму из потока?
+ стандартные методы извещения никто не отменял: после завершения работы потока шли главной форме сообщение, по которому она будет показывать вторую форму.
можно еще и событие прикрутить ( но с сообщением будет по-проще )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
NoliX
Дата 18.1.2006, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.7.2005

Репутация: нет
Всего: 1



ну вот и хочу открыть вторую форму из потока, а она не хочет открываться без синхронизации, а сообщения программе слать я не умею, можно пример?
Добавлено @ 20:43
мне нужно провести вот такие операции
Код

form5.label4.Caption:=IntToStr(z);
form5.label5.Caption:=IntToStr(z1);
form5.label6.Caption:=IntToStr(k1);
form5.label8.Caption:=PChar(TimeToStr(Now));
form5.label9.Caption:=TimeToStr(DateTimeToUnix(now) - pk);
Form4.label7.Caption:='Все сообщения отправлены';
Form4.Memo1.Lines.Add(DateTimeToStr(Now) + ': Все сообщения отправлены');
Form5.Memo1.Text:=Form4.Memo1.Text;
Form5.Show;
Form4.Hide;


первой формой является form4 второй form5
Добавлено @ 20:43
PS это не весь поток =)
--------------------
Опыт - это учитель, который очень дорого берет за свои уроки
PM MAIL   Вверх
Демо
Дата 18.1.2006, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



Из дополнительного потока не создавай формы.

Метод может быть таким:

Код

unit Unit1;

interface

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

type

  TMyThread=class(TThread)
  private
    procedure Display;
  protected
    procedure Execute; override;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

{ TMyThread }

procedure TMyThread.Display;
begin
  Form1.Hide;
  Form2.Show;
end;

procedure TMyThread.Execute;
begin
  //Что-то делаем
  Sleep(3000);  //эмуляция работы
  Synchronize(Display);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Thr: TMyThread;
begin
  Thr := TMyThread.Create(True);
  Thr.FreeOnTerminate := True;
  Thr.Resume;
end;

end.




Код

unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Form1.Show;
end;

end.




--------------------
    
PM MAIL ICQ Skype   Вверх
NoliX
Дата 18.1.2006, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.7.2005

Репутация: нет
Всего: 1



Демо, все бы хорошо, так я уже пробывал делать, но вот низадача, данные которые мне нужно передать являются локальми переменными процедуры, если выносить в отдельную процедуру вывод в форму2 то нужно это процеду с параметрами объявлять, а он отказывается синхронизировать такую процедуру или я туплю просто...
Добавлено @ 21:12
просто в этом случае приходится переменные глобализировать, а этого не хотелось бы, кстати понравилась идея с извещениями, но как ее реализовать?
--------------------
Опыт - это учитель, который очень дорого берет за свои уроки
PM MAIL   Вверх
Демо
Дата 18.1.2006, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



Цитата(NoliX @ 18.1.2006, 22:08 Найти цитируемый пост)

анные которые мне нужно передать являются локальми переменными процедуры


Какой процедуры? Где она выполняется?


--------------------
    
PM MAIL ICQ Skype   Вверх
NoliX
Дата 18.1.2006, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.7.2005

Репутация: нет
Всего: 1



у меня поток отдельным юнитом создан, в этом потоке процедура поток.Execute, в ней все и происходит
--------------------
Опыт - это учитель, который очень дорого берет за свои уроки
PM MAIL   Вверх
Демо
Дата 18.1.2006, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



Цитата(NoliX @ 18.1.2006, 22:32 Найти цитируемый пост)

у меня поток отдельным юнитом создан, в этом потоке процедура поток.Execute, в ней все и происходит


Так процедура у тебя выполняется в потоке? Почему не используешь переменные потока?

Вот как раз сейчас пишу для себя задачу, посмотри пример. Спецю для тебя добавил временно поле в поток - FTestCounter

Код

unit ufMain;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Thr: TCountThread;

implementation

{$R *.dfm}

procedure Exec(Sender: TObject);
var
  Th: TCountThread;
  dt: TDateTime;
begin
    
  Th := TCountThread(Sender);
//Здесь работаем с любыми параметрами потока.
//Но в этой процедуре нельзя обращаться без синхронизации к раздельным ресурсам без Synchronize
  Th.Counter := 0;
  dt := Now;

  while Now-dt<0.00002 do
  begin
    Th.Counter := Th.Counter + 1;
  end;
end;

procedure OnEnd(Sender: TObject; var FreeThr: Boolean);
begin
//Снова работаем с полями
//Но эта процедура уже потокобезопасна. Здесь можно работать с VCL(например, как ты хотел, с формами)
  ShowMessage(IntToStr(TCountThread(Sender).Counter));
  FreeThr := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Thr := TCountThread.Create;
  Thr.ThrProc := Exec;
  Thr.OnComplete := OnEnd;
  Thr.Resume;
end;

end.



Код

unit uThreads;

interface

uses
  Classes, SysUtils;

type

  TCompleteProc=procedure(Sender: TObject; var FreeThr: Boolean);
  TThrProc=procedure(Sender: Tobject);

  TCountThread=class(Tthread)
  private
    FTestCounter: Integer;
    FOnComplete: TCompleteProc;
    FThrProc: TThrProc;
    procedure FComplete;
  protected
    procedure Execute; override;
  public
    constructor Create;
    destructor Destroy; override;

    property ThrProc: TThrProc read FThrProc write FThrProc;
    property OnComplete: TCompleteProc read FOnComplete write FOnComplete;
    property Counter: Integer read FTestCounter write FTestCounter;
  end;


implementation

{ TCountThread }

constructor TCountThread.Create;
begin
  inherited Create(True);
end;

destructor TCountThread.Destroy;
begin
  inherited;
end;

procedure TCountThread.Execute;
begin
  if Assigned(FThrProc) then FThrProc(Self);
  Synchronize(FComplete);
end;

procedure TCountThread.FComplete;
var
  FreeThr: Boolean;
begin
  FreeThr := False;
  if Assigned(FOnComplete) then FOnComplete(Self,FreeThr);
  if FreeThr then FreeOnTerminate := True;
end;

end.



Это сообщение отредактировал(а) Демо - 18.1.2006, 22:05


--------------------
    
PM MAIL ICQ Skype   Вверх
NoliX
Дата 18.1.2006, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.7.2005

Репутация: нет
Всего: 1



так щас посмотрю подходил ли мне такая штука, спасибо
в общем и целом содержимое потока (по порядку)

Подсчет данных (создание массивов их заполнение вычисление чисел)
Начало цикла
всякие операции
ЗАДЕРЖКА
вывод информации на форму 2 (с использованием переменных потока)
операции опять
конец цикла
вывод информации на форму 2 (с использованием переменных потока)
--------------------
Опыт - это учитель, который очень дорого берет за свои уроки
PM MAIL   Вверх
Демо
Дата 18.1.2006, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



вывод информации на форму 2 (с использованием переменных потока) - Synchronyze(Procedure1)
операции опять
конец цикла
вывод информации на форму 2 (с использованием переменных потока) - Synchronyze(Procedure2) или снова Synchronyze(Procedure1)


--------------------
    
PM MAIL ICQ Skype   Вверх
NoliX
Дата 18.1.2006, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.7.2005

Репутация: нет
Всего: 1



на синхронизации зависает теперь и все хмм, буду думать дальше...
и все таки, можно програмно попросить из потока программу выполнить некоторые функции
--------------------
Опыт - это учитель, который очень дорого берет за свои уроки
PM MAIL   Вверх
Демо
Дата 18.1.2006, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



Цитата(NoliX @ 18.1.2006, 23:41 Найти цитируемый пост)

и все таки, можно програмно попросить из потока программу выполнить некоторые функции


Из потока, как и из любой другой функции, можно вызвать на выполнение любую функцию или процедуру...


--------------------
    
PM MAIL ICQ Skype   Вверх
NoliX
Дата 18.1.2006, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.7.2005

Репутация: нет
Всего: 1



да нет, я не об этом, я вот об этом
Код

+ стандартные методы извещения никто не отменял:
 после завершения работы потока шли главной форме сообщение,
 по которому она будет показывать вторую форму.


Это сообщение отредактировал(а) NoliX - 18.1.2006, 23:23
--------------------
Опыт - это учитель, который очень дорого берет за свои уроки
PM MAIL   Вверх
Poseidon
Дата 19.1.2006, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 10
Всего: 133



Елы-палы. Ну и развели димагогию. Поток останавливается методом Suspend. Обратно возобновляется методом Resume. Пример нужен?


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
NoliX
Дата 19.1.2006, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.7.2005

Репутация: нет
Всего: 1



Poseidon не пойдет мне suspend!
нужно остановить поток не из приложения, а приостановить его из самого себя в цикле, в нужном месте!
--------------------
Опыт - это учитель, который очень дорого берет за свои уроки
PM MAIL   Вверх
Alexeis
Дата 19.1.2006, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Цитата

приостановить его из самого себя в цикле, в нужном месте!

а откуда он будет возобновлятся??


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Poseidon
Дата 19.1.2006, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 10
Всего: 133



Цитата(NoliX @ 19.1.2006, 12:21 Найти цитируемый пост)

приостановить его из самого себя в цикле, в нужном месте
Тогда sleep, что тут думать. Если это не основной поток программы, то зависания не будет, но поток "уснет" на указанное время.



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
AntonSaburov
Дата 19.1.2006, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 118



А объекты синхронизации Винды чем не нравятся ?

Вот тут можно посмотреть - http://msdn.microsoft.com/library/default....ent_objects.asp
PM MAIL WWW ICQ   Вверх
NoliX
Дата 19.1.2006, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.7.2005

Репутация: нет
Всего: 1



alexeis1, он будет приостановлен на несколько секунд, в общем мне нужен аналог sleep который при синхронизации не будет тормозить основную программу, либо каким-то образом
передавать

Код

+ стандартные методы извещения никто не отменял: 
после завершения работы потока шли главной форме 
сообщение, по которому она будет показывать вторую форму.

--------------------
Опыт - это учитель, который очень дорого берет за свои уроки
PM MAIL   Вверх
Poseidon
Дата 19.1.2006, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 10
Всего: 133



Цитата(NoliX @ 19.1.2006, 12:48 Найти цитируемый пост)

либо каким-то образом
передавать
"Какой-то образ" - это SendMesage (или PostMessage)



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
_hunter
Дата 19.1.2006, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



и опять мы возвращаемся к началу...
Sleep() торможит только текущий поток ( остальные не тормозятся )
поэтому если наблюдается торможение -- где0то в логике ошибка.
а что не понятно с сообщениями?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Alexeis
Дата 19.1.2006, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Poseidon прав
регистрируется сообщение
У формы делается обработчик
В нужный момент поток отправляет сообщение первой
форме.
обработчик запускает вторую форму - только так


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
NoliX
Дата 19.1.2006, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.7.2005

Репутация: нет
Всего: 1



Poseidon, кажется то что надо, а как с помощью этого выполнить допустим

Код

form5.label4.Caption:=IntToStr(z);    

Form4.Memo1.Lines.Add(DateTimeToStr(Now) + ': Все сообщения отправлены');    

Form4.Hide;

тоесть какими параметрами вызывать, или где их подглядеть?

Это сообщение отредактировал(а) NoliX - 19.1.2006, 14:00
--------------------
Опыт - это учитель, который очень дорого берет за свои уроки
PM MAIL   Вверх
Poseidon
Дата 19.1.2006, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 10
Всего: 133



Цитата(NoliX @ 19.1.2006, 12:56 Найти цитируемый пост)

тоесть какими параметрами вызывать, или где их подглядеть?
Какие параметры ты имеешь ввиду?

В обще виде где-то так
Код
SendMessage (MainForm.Handle, WM_User+101, 0, 0);


В главной форме пишешь обработчик сообщения WM_User+101, а в нем то, что нужно сделать при получении этого сообщения.



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
NoliX
Дата 19.1.2006, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.7.2005

Репутация: нет
Всего: 1



так, кажется начинаю понимать, осталось ознать, как написать обработчик сообщения =(
--------------------
Опыт - это учитель, который очень дорого берет за свои уроки
PM MAIL   Вверх
Alexeis
Дата 19.1.2006, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



вот пример drkb
Код

Один из способов - создать пользовательское сообщение и использовать метод preform чтобы разослать его всем формам из массива Screen.Forms. 

{Code for Unit1} 

const 
  UM_MyGlobalMessage = WM_USER + 1; 

type 
  TForm1 = class(TForm) 
    Label1: TLabel; 
    Button1: TButton; 
    procedure FormShow(Sender: TObject); 
    procedure Button1Click(Sender: TObject); 
  private 
  {Private declarations} 
    procedure UMMyGlobalMessage(var AMessage: TMessage); message 
      UM_MyGlobalMessage; 
  public 
  {Public declarations} 
  end; 

var 
  Form1: TForm1; 

implementation 

{$R *.DFM} 

uses Unit2; 

procedure TForm1.FormShow(Sender: TObject); 
begin 
  Form2.Show; 
end; 

procedure TForm1.UMMyGlobalMessage(var AMessage: TMessage); 
begin 
  Label1.Left := AMessage.WParam; 
  Label1.Top := AMessage.LParam; 
  Form1.Caption := 'Got It!'; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
  f: integer; 
begin 
  for f := 0 to Screen.FormCount - 1 do 
    Screen.Forms[f].Perform(UM_MyGlobalMessage, 42, 42); 
end; 

{Code for Unit2} 

const 
  UM_MyGlobalMessage = WM_USER + 1; 
type 
  TForm2 = class(TForm) 
    Label1: TLabel; 
  private 
  {Private declarations} 
    procedure UMMyGlobalMessage(var AMessage: TMessage); 
      message UM_MyGlobalMessage; 
  public 
  {Public declarations} 
  end; 

var 
  Form2: TForm2; 

implementation 

{$R *.DFM} 

procedure TForm2.UMMyGlobalMessage(var AMessage: TMessage); 
begin 
  Label1.Left := AMessage.WParam; 
  Label1.Top := AMessage.LParam; 
  Form2.Caption := 'Got It!'; 
end; 




--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
NoliX
Дата 19.1.2006, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.7.2005

Репутация: нет
Всего: 1



alexeis1, спасибо большое, сейчас попытаюсь разобраться, скорее всего это то, что нужно...
--------------------
Опыт - это учитель, который очень дорого берет за свои уроки
PM MAIL   Вверх
Poseidon
Дата 19.1.2006, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 10
Всего: 133



Цитата(NoliX @ 19.1.2006, 13:11 Найти цитируемый пост)

так, кажется начинаю понимать, осталось ознать, как написать обработчик сообщения =(


Да на самом деле все очень просто. Вот как обработать наше WM_User+101

Код
unit Unit1;

interface

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

type
  TMainForm = class(TForm)
  private
    //сюда добавляем обьявление
    procedure WMUser101(var Msg: TMessage); message WM_User+101;
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

{ TForm1 }

procedure TMainForm.WMUser101(var Msg: TMessage);
begin
// тут пишем что будем делать при получении WM_User+101
end;

end.



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
NoliX
Дата 19.1.2006, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.7.2005

Репутация: нет
Всего: 1



Poseidon, все замечательно, это действительно то что надо, спасибо, mjkmrj вот последний вопрос, мне нужно в этом сообщении передать больше 2-х переменных, это возмжно?
и как тогда их вызвать в процедуре обработки события, первые 2 как я понят вызываются
WParam
LParam

Это сообщение отредактировал(а) NoliX - 19.1.2006, 14:42
--------------------
Опыт - это учитель, который очень дорого берет за свои уроки
PM MAIL   Вверх
_hunter
Дата 19.1.2006, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



больше параметров передать нельзя.
но никто не мешает создать структуру и передать одним из параметров указатель на нее


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
NoliX
Дата 19.1.2006, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.7.2005

Репутация: нет
Всего: 1



Все ясно, всем принимавшим участие огромное спасибо, в том числе и за терпение, дальше разберусь сам...
--------------------
Опыт - это учитель, который очень дорого берет за свои уроки
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0812 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.