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

नीचे

धागा: निलंबित / फिर से शुरू और सिंक्रनाइज़ करें इसी तरह की शाखाएँ खोजें


mitry   (2001-12-15 02:53) [0]

Уважаемые коллеги, помогите пожалуйста, я не спал уже 3 ночи.
समस्या यह है:
Если часто приостанавливать(Suspend) и запускать(Resume) поток, который вызыает Synchronize, то при перерисовке окна, программа часто виснет.
Например, если запустить следующую программу и попереключаться между ней и Delphi, то нижеприведенное приложение умолкнет навеки:

का उपयोग करता है
विंडोज, संदेश, SysUtils, कक्षाएं, ग्राफिक्स, नियंत्रण, प्रपत्र,
Dialogs, ExtCtrls, StdCtrls, ComCtrls;

टाइप

TMyThread = वर्ग (TThread)
निजी
procedure Update;
संरक्षित
प्रक्रिया निष्पादन; ओवरराइड;
अंत;

TMainForm = वर्ग (TForm)
टिमरएक्सन्यूएमएक्स: टीटीमेर;
प्रक्रिया फॉर्म क्रिएट (प्रेषक: TObject);
प्रक्रिया फॉर्मक्लाउज़ (प्रेषक: टोबिज; var एक्शन: TCloseAction);
प्रक्रिया Timer1Timer (प्रेषक: Tobject);
निजी
{निजी घोषणाएँ}
MyThread: TMyThread;
सार्वजनिक
{सार्वजनिक घोषणाएँ}
अंत;

था
मेनफॉर्म: टीएमफार्म;

कार्यान्वयन

{$ R * .dfm}

procedure TMyThread.Update;
शुरू करना
//
अंत;

प्रक्रिया TMyThread.Execute;
शुरू करना
दोहराना
नींद (100);
Synchronize(Update);
समाप्त होने तक;
अंत;

प्रक्रिया TMainForm.FormCreate (प्रेषक: TObject);
शुरू करना
MyThread: = TMyThread.Create (झूठी);
टाइमरएक्सयूएनएक्सएक्स.इंटरवल: = एक्सएनयूएमएक्स;
Timer1.Enabled: = true;
अंत;

प्रक्रिया TMainForm.FormClose (प्रेषक: Tobject; var क्रिया: TCloseAction);
शुरू करना
Timer1.Enabled: = false;
if MyThread.Suspended then MyThread.Resume;
MyThread.Terminate;
MyThread.WaitFor;
MyThread.Free;
अंत;

procedure TMainForm.Timer1Timer(Sender: TObject);
शुरू करना
if not MyThread.Suspended then MyThread.Suspend else MyThread.Resume;
अंत;

Нужно это все вот для чего: я сделал анимированную кнопку: наводишь на нее мышкой - запускается поток, проигрывающий анимацию, убираешь мышку - поток останавливается. Пользователь может возить мышкой довольно часто, поэтому это и приводит к вышеописанной проблеме.
В моей программе нельзя использовать Timer вместо потоков.
Если кто-нибудь подскажет в чем тут дело, я подарю ему свои лучшие компоненты(включая анимированную кнопку). Торжественно клянусь.
Прошу прощения за длинный вопрос, но короче никак нельзя.
Delphi6, Win98.
धन्यवाद.



paul_shmakov   (2001-12-16 02:06) [1]

использование suspend/resume в данном случае не лучший выход. да и использование потока для каждой кнопки - тоже плохо. но раз нужен поток, тогда почему бы не сделать проще: когда возникает необходимость начать воспроизводить анимацию мы устанавливаем флаг , метод execute проверяет этот флаг, и, если он установлен, выполняет прорисовку анимации. когда курсор с кнопки ушел - сбрасываем этот флаг.
единственное, чтобы не было проблем, флаг нужно менять вызовом одной из Interlocked* функций. например, InterlockedIncrement/InterlockedDecrement.

"Прошу прощения за длинный вопрос, но короче никак нельзя."
все бы вопросы были такими длинными и подробными :)



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

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

ऊपर









मेमोरी: 0.82 एमबी
समय: 0.031 c
6-22297
इन्क्वायरर
2001-10-10 17:09
2002.01.08
सलाह जो कर सकते हैं


1-22020
सिंह ^ सूर्य
2001-12-18 07:08
2002.01.08
TMemo


14-22358
गाढ़ा
2001-11-07 19:08
2002.01.08
जहां फ्रिसली लघु लेकिन उच्च गति होस्टिंग है?


1-22098
अलेक्जेंडर
2001-12-19 14:58
2002.01.08
कौन जानता है कि आईपी पते के आईपी संपादक या किस घटक को बाहर निकालना है?


1-22221
खट्टा
2001-12-16 21:00
2002.01.08
Ресурсы





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