Форум: "WinAPI";
Текущий архив: 2005.01.02;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.01.02;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.032 c