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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2011, 18:27   #1
Kamalekb
Пользователь
 
Регистрация: 08.09.2009
Сообщений: 20
По умолчанию SendMessage между потоками

Добрый вечер. Не получаеться решить задачу.

Даны 2 потока.
Поток А генерирует случайные числа от 0 до 100.

if Если Value < 80 then PostMessage(WM_USER + 10, Value)
if(Value >= 80) and (Value=<90) thenPostMessage(WM_USER + 11, Value)
if (Value > 90) then (WM_USER + 12, Value)

И посылает сообщение SendMessage

Поток Б принимает значение WM_user, и в зависимости от того, какой WM_User пришел, окрашивает Edit

Вот программный код:



Код:
var
  Form1: TForm1;
  ThreadId1,ThreadId2:dword;
  HThread1,HThread2: THandle;
  Window: HWND;
  Message : TMsg;

procedure potokA;
var
  Value: integer;
begin
   Randomize;
  while true do
  begin
    value := Random(100);
    Form1.Edit1.Text:=IntToStr(Value);

    if(value<80) then PostMessage(Window, WM_USER + 10, value, 0);
    if(value>=80)and(value<90) then PostMessage(Window, WM_USER + 11, value, 0);
    if(value>90) then sendmessage(Window, WM_USER + 12, value, 0);
    Sleep(500);
  end;
end;


procedure potokB (var message: TMessage);
begin

if(Msg.message = WM_USER + 10) then
  begin
    Form1.Edit1.Text := IntToStr(Msg.message);
    Form1.Edit1.Color := clGreen;
  end;
  if(Msg.message = WM_USER + 11) then
  begin
    Form1.Edit1.Text := IntToStr(Msg.message);
    Form1.Edit1.Color := clBlue;
  end;
  if(Msg.message = WM_USER + 12) then
  begin
    Form1.Edit1.Text := IntToStr(Msg.message);
    Form1.Edit1.Color := clRed;
  end;


procedure TForm1.Button1Click(Sender: TObject);
begin
Window := form1.Handle;
HThread1:=CreateThread (nil, 0, @ potokA, nil, 0, ThreadID1);
HThread2:=CreateThread (nil, 0, @ potokB, nil, 0, ThreadID2);

Последний раз редактировалось Kamalekb; 20.12.2011 в 18:34.
Kamalekb вне форума Ответить с цитированием
Старый 20.12.2011, 21:21   #2
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

И.... что?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 20.12.2011, 21:48   #3
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Если не ошибаюсь, то SendMessage для оконнных компонентов. Для потоков PostThreadMessage.
Код:
var
  Form1: TForm1;
  ThreadId1,ThreadId2:dword;
  HThread1,HThread2: THandle;
  Window: HWND;
  Messages : TMsg;

implementation

{$R *.dfm}

procedure potokA;
var
  Value: integer;
begin
   Randomize;
  while true do
  begin
    value := Random(100);
    Form1.Edit1.Text:=IntToStr(Value);
    if(value<80) then PostThreadMessage(ThreadID2, WM_USER + 10, value, 0);
    if(value>=80)and(value<90) then PostThreadMessage(ThreadID2, WM_USER + 11, value, 0);
    if(value>90) then PostThreadMessage(ThreadID2, WM_USER + 12, value, 0);
    Sleep(500);
  end;
end;


procedure potokB;
var Msg : TMsg;
begin
While GetMessage(Msg,0,0,0) do
 begin
  TranslateMessage(Msg);
  DispatchMessage(Msg);
if(Msg.message = WM_USER + 10) then
  begin
    Form1.Edit1.Text := IntToStr(Msg.WParam);
    Form1.Edit1.Color := clGreen;
  end;
  if(Msg.message = WM_USER + 11) then
  begin
    Form1.Edit1.Text := IntToStr(Msg.WParam);
    Form1.Edit1.Color := clBlue;
  end;
  if(Msg.message = WM_USER + 12) then
  begin
    Form1.Edit1.Text := IntToStr(Msg.WParam);
    Form1.Edit1.Color := clRed;
  end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Window := form1.Handle;
HThread1:=CreateThread (nil, 0, @potokA, nil, 0, ThreadID1);
HThread2:=CreateThread (nil, 0, @potokB, nil, 0, ThreadID2);
end;
eoln вне форума Ответить с цитированием
Старый 20.12.2011, 21:53   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

ТС, я вам уже говорил. send|PostMessage это ДЛЯ ОКОН. Ваши потоки не имеют окон. И по этому не смогут обработать эти сообщения.

И ксти, вы настолько ленивы чтобы поискать? http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Человек_Борща вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск маршрутов между двумя городами между n городов DorianMark Паскаль, Turbo Pascal, PascalABC.NET 11 09.11.2011 00:46
Потоки. Сообщения между потоками mig_ira Общие вопросы Delphi 10 09.08.2010 17:34
В чём отличие между SendMessage и PostMessage? TwiX Общие вопросы Delphi 2 29.07.2009 20:16
Как грамотно разделить данные между потоками? bagulma Общие вопросы Delphi 5 28.05.2008 22:41