घर
Top.Mail.Ru Yandeks.Metrika
मंच: "मुख्य";
वर्तमान संग्रह: 2003.09.01;
डाउनलोड करें: [xml.tar.bz2];

नीचे

नींद के धागे को कैसे जारी करें? इसी तरह की शाखाएँ खोजें


Aleksandr   (2003-08-15 14:41) [0]

В программе работает поток типа Шедулера. То есть его выполнение состоит из вычисления оставшегося времени до события, после чего он на это время выполняет Sleep, а по пробудке выполняет событие:

procedure TSheduler.Execute;
begin
repeat
if InitWaitTime then begin // если запланировано событие, установить время ожидания
Sleep(FWaitTime); // спать время ожидания
DoCurrentEvent // выполнить событие
end
else
Sleep(FIdleTime) // просто слегка отдохнуть, чтобы не загружать
until Terminated //FreeOnTerminate=false
end;

Код не самый удачный, но он рожден унификацией одного модуля для нескольких программ. Отсюда же вытекает и проблема - если программу, в которой работает шедулер, закрыть, то на вызове Free спящего потока она просто повесится до его пробуждения. Вызов Terminate и Resume перед освобождением ничего не дает.



Spawn   (2003-08-15 14:43) [1]

А ты не используй Sleep, а юзай GetTickCount с постоянной проверкой на состояние потока.



vuk   (2003-08-15 14:46) [2]

नींद क्यों आती है? शायद एक टाइमआउट के साथ WaitForSingleObject बेहतर है? उसी समय, ईवेंट की प्रतीक्षा करें, और इस ईवेंट के होने पर, धागा पूरा करें?



vuk   (2003-08-15 14:48) [3]

हालांकि, अगर Sheduler और WinXP, आप WaitableTimer का उपयोग कर सकते हैं ...



Aleksandr   (2003-08-15 14:51) [4]

Конечно, лучше WaitForSingleObject. Я бы так и сделал, но, на данный момент, некоторые технические соображения требуют попытаться решить проблему без переделок модуля с этим недорожденным (то есть нет исходного кода).



Serginio784   (2003-08-15 15:02) [5]

SleepEx



Camus   (2003-08-15 15:14) [6]

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

1. Вариант с API - что-то типа этого:
CanClose := GetExitCodeThread(...) <> STILL_ACTIVE;

2. Чисто VCL"ный вариант - при создании потока назначить ему OnTerminate, в обработчике выставлять флаг, а CanClose выдавать по этому флагу.



Aleksandr   (2003-08-15 15:26) [7]

Serginio784 :
Как я уже написал, код шедулера не поддается изменениям. И, кстати, насколько я понимаю, эта функция может выходить только по ошибкам ввода/вывода?

Camus :
Ну что же... Дождаться без эффекта повисания - тоже вариант :). Особенно, если событие запланировано на через неделю после запуска программы :)))



Serginio412   (2003-08-15 15:29) [8]

>Aleksandr © (15.08.03 15:26) [7]
एपीसी



pasha_golub   (2003-08-15 16:12) [9]

Можно очень грубо покилять процесс с помощью АПИ, ИМХО



pasha_golub   (2003-08-15 16:14) [10]

TerminateThread(...) как раз для аварийного останова



Aleksandr   (2003-08-15 16:43) [11]

О, вот это в самый раз. Главное, сам знал, но по тупости забыл. Спасибо.



vuk   (2003-08-15 17:06) [12]

Вы, однако, поосторожнее с TerminateThread, а то можно утечек памяти и ресурсов нахвататься...



Aleksandr   (2003-08-15 17:29) [13]

Ну да... можно, насколько я понимаю, если у потока есть объекты-свойства, освобождаемые в дестракторе. А без них вроде ничего.



vuk   (2003-08-15 17:42) [14]

फिर से लाइनें ...



पन्ने: 1 पूरी शाखा

मंच: "मुख्य";
वर्तमान संग्रह: 2003.09.01;
डाउनलोड करें: [xml.tar.bz2];

ऊपर





मेमोरी: 0.59 एमबी
समय: 0.047 c
1-1478
चालाक
2003-08-18 12:37
2003.09.01
कार्य शेड्यूलर चलाएँ


14-1592
Vsevolod Solovyov
2003-08-13 22:21
2003.09.01
:)) कार्ड


1-1506
व्लादिमीर बेरेसिन
2003-08-15 22:21
2003.09.01
संकेत के बारे में प्रश्न


4-1720
रिमर
2003-06-28 00:27
2003.09.01
ListBox में क्षैतिज स्क्रॉलिंग


4-1704
रिमर
2003-06-17 23:14
2003.09.01
अपनी खिड़की को कैसे सक्रिय करें (फोकस को स्थानांतरित करें)?





अफ्रीकी अल्बानियन अरबी भाषा अर्मेनियाई आज़रबाइजानी बस्क बेलारूसी बल्गेरियाई कैटलन सरलीकृत चीनी) चीनी पारंपरिक) क्रोएशियाई चेक डेनिश डच अंग्रेज़ी एस्तोनियावासी फिलिपिनो फिनिश फ्रेंच
गैलिशियन् जॉर्जियाई जर्मन यूनानी हाईटियन यहूदी हिंदी हंगरी आइसलैंड का इन्डोनेशियाई आयरिश इतालवी जापानी कोरियाई लात्वीयावासी लिथुआनियाई मेसीडोनियन मलायी मोलतिज़ नार्वेजियन
फ़ारसी पोलिश पुर्तगाली रोमानियाई रूसी सर्बियाई स्लोवाक स्लोवेनियाई स्पेनिश स्वाहिली स्वीडिश थाई तुर्की यूक्रेनी उर्दू वियतनामी वेल्श यहूदी बंगाली बोस्नियाई
सिबुआनो एस्पेरांतो गुजराती हौसा हमोंग ईग्बो जावानीस कन्नड़ खमेर लाओ लैटिन माओरी मराठी मंगोलियन नेपाली पंजाबी सोमाली तामिल तेलुगु योरूबा
ज़ुलु
Английский Французский Немецкий Итальянский Португальский Русский Испанский