Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.09.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
Verg   (2003-09-12 17:06) [0]

Никак до меня не доходит как использовать эту переменную...
В целях чего, зачем, в каких случаях?


Assign a method to WakeMainThread before calling a thread’s Synchronize method. When you call a thread’s Synchronize method, it calls the method assigned to WakeMainThread once it has obtained a lock on the main GUI thread. This allows other threads to quickly synchronize with the GUI thread even if no events are being processed due to an idle state


Каким образом?

Т.е. что, в методе, который я назначу в WakeMainThread я должен какое-то холостое сообщение послать главному потоку, чтобы он блин перестал idle-ть?
Или что?


 
Verg   (2003-09-12 18:19) [1]

Ну блин борман дает.

Че-то он тут опять намудрил.
Это в D6 модуль classes.
Вот первая совершенно детская ошибка:

Процедура Synchronize

FSynchronizeException := nil;
FMethod := Method;
SyncProc.Thread := Self;
SyncList.Add(@SyncProc); ProcPosted := True;
if Assigned(WakeMainThread) then
WakeMainThread(Self);
{$IFDEF MSWINDOWS}
LeaveCriticalSection(ThreadLock);
try
WaitForSingleObject(SyncProc.Signal, INFINITE);
finally


Ну, а если в WakeMainThread(Self) будет exception?
Поток, у которого нет ловушки except в execute немедленно прекратит свое существование и всвязи с FreeOnTerminate=true
будет уничтожен как объект. Да, НО!
.....
SyncProc.Thread := Self;
SyncList.Add(@SyncProc):
....
Это-то уже сделано!

Ешкин кот! и первый же CheckSynchronize грохнется с Access Violetion.....

Надо ж было бы хотябы свою ж...-то прикрыть:

I:=SyncList.Add(@SyncProc);
ProcPosted := True;

if Assigned(WakeMainThread) then
try
WakeMainThread(Self);
except
SyncList.Delete(I);
raise;
end;


 
Verg   (2003-09-12 18:28) [2]

Далее читаем:
In a non-GUI application, you must call CheckSynchronize if you use the Synchronize method of TThread. To do this, set the WakeMainThread variable to a procedure that calls CheckSynchronize.

Ага! Щазз!!
Чтобы первый же Synchronize вызвал остановку потока?!

Т.к.
Synchronize приводит к вызову WakeMainThread, тот по Help-у должен вызвать CheckSynchronize, а тот в свою очередь:

function CheckSynchronize: Boolean;
var
SyncProc: PSyncProc;
begin
if GetCurrentThreadID <> MainThreadID then
raise EThread.CreateResFmt(@SCheckSynchronizeError, [GetCurrentThreadID]);


Ага и в рез-те Synchronize может ползоваться только MainThread, с чем я и поздравляю бормана....



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

Форум: "Основная";
Текущий архив: 2003.09.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.009 c
3-82078
alex-ran
2003-09-05 15:23
2003.09.25
Проблема с функциями в SQL


1-82310
bug008
2003-09-10 12:29
2003.09.25
различия Delphi 7, 6, 5


3-82147
АлеКс
2003-09-03 04:13
2003.09.25
Не срабатывают события TADOQuery


8-82343
KoNDoR
2003-05-29 21:22
2003.09.25
Триангулированая поверхность


14-82394
Vlad Oshin
2003-09-04 17:50
2003.09.25
Флейм. Сигареты легкие или тяжелые?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский