Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.02;
Скачать: CL | DM;

Вниз

Thread   Найти похожие ветки 

 
GanibalLector ©   (2004-11-18 02:58) [0]

Откроем пример в Demos\Thread.Есть такие строка :
...
 Synchronize(DoVisualSwap);
...


А как эта строка будет выглядеть,если я создаю поток таким образом :
function potok(Param: Pointer): DWord; stdcall;
begin
...
Result:=0;exitthread(Result);
end;

CreateThread(nil,0,@potok,nil,0,ThreadID);


 
GanibalLector ©   (2004-11-18 03:03) [1]

Если ходить по F7,то сразу вываливаюсь. Тут6

procedure TThread.Synchronize(Method: TThreadMethod);
begin
 FSynchronizeException := nil;
 FMethod := Method;
SendMessage(ThreadWindow, CM_EXECPROC, 0, Longint(Self));
 if Assigned(FSynchronizeException) then raise FSynchronizeException;
end;


 
GanibalLector ©   (2004-11-18 03:10) [2]

У меня есть вариант отсылать сообщение основному потоку,а там,по приходу оного что-нибудь творить с VCL-контролами.Но интересно,а как же это делает Synchronize?


 
Evgeny V ©   (2004-11-18 07:33) [3]

А посмотри исходники classes.pas Кстати в дельфи 5 и 6 это реализовано по разному.


 
Digitman ©   (2004-11-18 08:24) [4]


> Если ходить по F7,то сразу вываливаюсь


что значит "вываливаешься" ?


 
GanibalLector ©   (2004-11-18 09:38) [5]

>что значит "вываливаешься" ?
D5 вываливается.Что-то типа : not responding

Ну а в теории.Угадал ли я? См [5]


 
Digitman ©   (2004-11-18 09:48) [6]


> GanibalLector ©   (18.11.04 09:38) [5]


> D5 вываливается.Что-то типа : not responding


что-то я не понимаю, что там у тебя "вываливаться" может, если ты трассируешь заведомо корректный штатный код метода Synchronize


> Ну а в теории.Угадал ли я?


в смысле [2] ?

ну да, в Д5 именно так это и делается.
только сообщение CM_EXEC посылается не осн.трэду, а тому трэду, который впервые вызвал конструктор TThread и создал при этом окно, которому будут адресоваться CM_EXEC-сообщения .. а это вполне м.б. и любой иной трэд, нежели основной .. так что синхронизация с осн.трэдом будет работать правильно лишь в том случае, если самый первый экз-р TThread был создан именно осн.трэдом, а не каким-то иным


 
panov ©   (2004-11-18 10:01) [7]

Непонятно, все-таки, что тебе надо.

Если тебе надо синхронизировать поток, созданный CreateThread или BeginThread, то Synchronize тут ни при чем.

Если ты хочешь реализацию по аналоги с TThread.Synchronize, то вариант с посылкой сообщения мне кажется наиболее подходящим.


const WM_MyThreadSync=WM_USER+xxx;

...

SendMessage(
 <Здесь дескриптор окна, в котором должно обработаться сообщение>,
 WM_MyThreadSync,  //Номер сообщения
 0,
 Longint(@MyProc)  //Адрес процедуры для выполнения
         );


При обработке:


var
 Proc: TProcedure;
case Msg.Message of
 Msg.Message=WM_MyThreadSync:
    begin
      @Proc := Pointer(Msg.lParam);
      if Assigned(Proc) then Proc;
    end;



Страницы: 1 вся ветка

Текущий архив: 2005.01.02;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.061 c
3-1102082356
korvin
2004-12-03 16:59
2005.01.02
Неправильный результат в процедуре


14-1103127195
Cerberus
2004-12-15 19:13
2005.01.02
Статичная dll


1-1103253401
SeZuka
2004-12-17 06:16
2005.01.02
FreeReport 2.3 принтер по умолчанию


6-1097488238
Green Templar
2004-10-11 13:50
2005.01.02
internet connection


1-1103211571
Frozzen
2004-12-16 18:39
2005.01.02
Перестал работать дебагер!