منزل
Top.Mail.Ru Yandeks.Metrika
المنتدى: "Main";
الأرشيف الحالي: 2002.01.08;
تنزيل: [xml.tar.bz2];

إلى

الموضوع: تعليق / استئناف & تزامن البحث عن فروع مماثلة


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

Уважаемые коллеги, помогите пожалуйста, я не спал уже 3 ночи.
المشكلة هي:
Если часто приостанавливать(Suspend) и запускать(Resume) поток, который вызыает Synchronize, то при перерисовке окна, программа часто виснет.
Например, если запустить следующую программу и попереключаться между ней и Delphi, то нижеприведенное приложение умолкнет навеки:

يستخدم
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ComCtrls;

نوع

TMyThread = class (TThread)
خاص
تحديث الإجراء ؛
محمي
تنفيذ الإجراء ؛ تجاوز.
الغاية؛

TMainForm = فئة (TForm)
Timer1: TTimer ؛
إجراء FormCreate (المرسل: TObject) ؛
procedure FormClose(Sender: TObject; var Action: TCloseAction);
الإجراء Timer1Timer (المرسل: TObject) ؛
خاص
{الإعلانات الخاصة}
MyThread: TMyThread;
جمهور
{الإعلانات العامة}
الغاية؛

فار
MainForm: TMainForm؛

التنفيذ

{$ R * .dfm}

procedure TMyThread.Update;
بدأ
//
الغاية؛

الإجراء TMyThread.Execute ؛
بدأ
كرر
النوم (100) ؛
Synchronize(Update);
حتى يتم إنهاؤها
الغاية؛

الإجراء TMainForm.FormCreate (المرسل: TObject) ؛
بدأ
MyThread := TMyThread.Create(false);
Timer1.Interval := 1;
Timer1.Enabled := true;
الغاية؛

procedure TMainForm.FormClose(Sender: TObject; var Action: 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 فرع كامل

المنتدى: "Main";
الأرشيف الحالي: 2002.01.08;
تنزيل: [xml.tar.bz2];

الطابق العلوي









الذاكرة: 0.56 ميغابايت
الوقت: 0.024 ج
1-22021
Socol
2001-12-18 08:54
2002.01.08
تحميل الملف!


6-22283
Yuraz
2001-10-08 11:05
2002.01.08
كيف يمكنني حتى توصيل طابعة الشبكة ، بالإضافة إلى الطريقة القياسية؟


1-22043
سيرج
2001-12-18 19:18
2002.01.08
حذف الكائن


1-22164
WarChilD
2001-12-19 21:46
2002.01.08
ListBox -> صف حدد


14-22381
فيليكس
2001-11-08 20:41
2002.01.08
ماذا كان ذلك؟





الأفريكانية الألبانية عربي الأرميني أذربيجان الباسكي البيلاروسية Bulgarian التشيكية الصينية المبسطة) تقاليد صينية) الكرواتية التشيكية دانماركي Dutch أنجليزي الإستونية الفلبينية Finnish جيب
الجاليكية الجورجية الألمانيّة اليونانيّة الكريولية الهايتية اللغة العبرية الهندية الهنغارية أيسلندي Indonesian الأيرلندية Italian اليابانيّة الكوريّة اللاتفية اللتوانية المقدونية الملايو المالطية Norwegian
اللغة الفارسية بولنديّة البرتغاليّة رومانية Russian صربي السلوفاكيّة سلوفيني إسباني السواحيلي Swedish Thai التركية الأوكراني الأردية الفيتنامية ويلزي اليديشية البنغالي البوسنية
السيبيونو الاسبرانتو الغوجاراتية الهوسا همونغ الإيبو جاوي الكانادا الخمير لاو لاتينية الماوري المهاراتية المنغولية النيبالية البنجابية الصومالية التاميل التيلجو اليوروبا
زولو
Английский Французский ألماني Итальянский البرتغالية Русский Испанский