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

إلى

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


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

زملائي الأعزاء ، الرجاء المساعدة ، لم أنم بالفعل ليال من 3.
المشكلة هي:
إذا قمت غالبًا بإيقاف (Suspend) وبدء (استئناف) سلسلة الرسائل التي تزامن المكالمات ، فعندما تعيد رسم النافذة ، يتجمد البرنامج غالبًا.
على سبيل المثال ، إذا قمت بتشغيل البرنامج التالي وقمت بالتبديل بينه وبين Delphi ، فسيصمت التطبيق أدناه إلى الأبد:

يستخدم
ويندوز ، الرسائل ، SysUtils ، الطبقات ، الرسومات ، عناصر التحكم ، النماذج ،
مربعات الحوار ، ExtCtrls ، StdCtrls ، ComCtrls ؛

نوع

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

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

فار
MainForm: TMainForm؛

التنفيذ

{$ R * .dfm}

الإجراء TMyThread.Update؛
بدأ
//
الغاية؛

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

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

الإجراء TMainForm.FormClose (المرسل: TObject ؛ var الإجراء: TCloseAction) ؛
بدأ
Timer1.Enabled: = false؛
إذا MyThread.Suspended ثم MyThread.Resume ؛
MyThread.Terminate.
MyThread.WaitFor.
MyThread.Free.
الغاية؛

الإجراء TMainForm.Timer1Timer (المرسل: TObject) ؛
بدأ
إن لم يكن MyThread.Suspended ثم MyThread.Suspend else MyThread.Resume؛
الغاية؛

كل ما نحتاجه لذلك: لقد صنعت زرًا متحركًا: تحوم فوقه بالماوس - الدفق الذي يلعب الرسوم المتحركة يبدأ ، يمكنك إزالة الماوس - يتوقف الدفق. يمكن للمستخدم استخدام الماوس في كثير من الأحيان ، وهذا هو السبب في أن هذا يؤدي إلى المشكلة المذكورة أعلاه.
في برنامجي ، لا يمكنك استخدام Timer بدلاً من مؤشرات الترابط.
إذا أخبرني شخص ما الأمر ، فسأقدم له أفضل مكوناتي (بما في ذلك زر متحرك). أقسم رسميًا.
أعتذر عن السؤال الطويل ، ولكنني أقصر من ذلك.
Delphi6 ، Win98.
شكرا لك.



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

استخدام تعليق / استئناف في هذه الحالة ليس هو الحل الأفضل. واستخدام دفق لكل زر هو أيضا سيء. ولكن نظرًا لأنك تحتاج إلى دفق ، فلماذا لا تجعل الأمر أكثر سهولة: عندما يصبح من الضروري بدء تشغيل الرسوم المتحركة ، نقوم بتعيين العلم ، وتقوم طريقة التنفيذ بالتحقق من هذه العلامة ، وإذا تم تعيينها ، فسوف ترسم الرسوم المتحركة. عندما يترك المؤشر الزر - إعادة تعيين هذه العلامة.
الشيء الوحيد هو أنه لا ينبغي أن يكون هناك أي مشاكل ، يجب تغيير العلامة عن طريق استدعاء إحدى وظائف Interlocked *. على سبيل المثال ، InterlockedIncrement / InterlockedDecrement.

"أعتذر عن السؤال الطويل ، لكن لا أقصر."
جميع الأسئلة ستكون طويلة جدا ومفصلة :)



صفحات: 1 فرع كامل

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

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









الذاكرة: 0.56 ميغابايت
الوقت: 0.03 ج
1-22247
كما
2001-12-17 11:29
2002.01.08
مساعدة من يستطيع .....


1-22181
غذاء
2001-12-21 11:12
2002.01.08
كيفية حظر حركة شكل الماوس؟


1-22236
T2
2001-12-16 07:10
2002.01.08
serial.vxd


14-22412
fishka
2001-11-12 14:50
2002.01.08
المكونات وموقعها لراحة المشغل (Delphi 3)


7-22446
المفارقة
2001-09-25 19:12
2002.01.08
لا تفوت ، حسنا ، ضروري جدا.





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