Casa
Top.Mail.Ru Yandeks.Metrika
Foro: "Principal";
Archivo actual: 2002.01.08;
Descargar: [xml.tar.bz2];

abajo

Hilo: Suspender / Reanudar y sincronizar Encontrar ramas similares


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

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

usos
Windows, Mensajes, Sistemas, Clases, Gráficos, Controles, Formularios,
Dialogs, ExtCtrls, StdCtrls, ComCtrls;

tipo

TMyThread = class (TThread)
privada
Actualización del procedimiento;
protegido
Procedimiento de ejecución; anular
fin;

TMainForm = clase (TForm)
Timer1: TTimer;
procedimiento FormCreate (Sender: TObject);
procedimiento FormClose (Sender: TObject; var Action: TCloseAction);
procedimiento Timer1Timer (Sender: TObject);
privada
{Declaraciones privadas}
MyThread: TMyThread;
público
{Declaraciones públicas}
fin;

var
MainForm: TMainForm;

implementación

{$ R * .dfm}

procedure TMyThread.Update;
comenzar
//
fin;

procedimiento TMyThread.Execute;
comenzar
repetir
Sleep (100);
Synchronize(Update);
hasta terminado
fin;

procedimiento TMainForm.FormCreate (Sender: TObject);
comenzar
MyThread := TMyThread.Create(false);
Timer1.Interval := 1;
Timer1.Enabled := true;
fin;

procedimiento TMainForm.FormClose (Sender: TObject; var Action: TCloseAction);
comenzar
Timer1.Enabled := false;
if MyThread.Suspended then MyThread.Resume;
MyThread.Terminate;
MyThread.WaitFor;
MyThread.Free;
fin;

procedure TMainForm.Timer1Timer(Sender: TObject);
comenzar
if not MyThread.Suspended then MyThread.Suspend else MyThread.Resume;
fin;

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



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

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

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



Páginas: 1 rama entera

Foro: "Principal";
Archivo actual: 2002.01.08;
Descargar: [xml.tar.bz2];

arriba









Memoria: 0.82 MB
Tiempo: 0.035 c
1-22200
Sergei_B
2001-12-15 09:57
2002.01.08
Intxnumx y tamaño de archivo


3-21941
jin
2001-11-30 14:56
2002.01.08
Ayuda, por favor crea un procedimiento IB SQL desde la aplicación


14-22351
nikols
2001-10-31 18:55
2002.01.08
Encuesta: Quién está comprometido (sabe, está interesado en CORBA)


4-22465
AKV
2001-11-02 10:44
2002.01.08
Cómo determinar el identificador de ventana sobre el que se encuentra el mouse


1-22032
Socol
2001-12-18 10:01
2002.01.08
Monopulation de números.





africaans albanés Arabic armenio Azerbaiyán vasco Bielorruso Bulgarian Catalán Chino (simplificado) Chino (tradicional) Croata Checo Danés Dutch Inglés Estonia filipina Finnish Francés
gallego georgiano Alemán Griego criollo haitiano hebreo hindi Húngaro islandés Indonesian irlandés Italiana Japonés Korean letón lituano macedonio Malay maltés Noruego
persa polaco Portuguese rumano Ruso Serbio Slovak Esloveno Español swahili Sueco Thai turco ucranio Urdu vietnamita galés yídish bengalí bosnio
cebuano esperanto gujarati hausa hmong igbo javanés kannada khmer lao latín maorí marathi mongol nepali punjabi somalí Tamil telugu yoruba
zulú
Английский Francés Alemán Italiano portugués Русский Español