Nach Hause
Top.Mail.Ru Yandeks.Metrika
Forum: "Haupt";
Aktuelles Archiv: 2002.01.08;
Herunterladen: [xml.tar.bz2];

Nach unten

Thread: Suspend / Resume & Synchronize Finden Sie ähnliche Zweige


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

Liebe Kolleginnen und Kollegen, bitte helfen Sie, ich habe noch keine 3-Nächte geschlafen.
Das Problem ist:
Wenn Sie den Thread, der Synchronize aufruft, häufig aussetzen (Suspend) und ausführen (Resume), hängt das Programm beim Neuzeichnen des Fensters häufig.
Wenn Sie beispielsweise das folgende Programm ausführen und zwischen Delphi wechseln, bleibt die folgende Anwendung für immer still:

verwendet
Windows, Meldungen, SysUtils, Klassen, Grafiken, Steuerelemente, Formulare,
Dialoge, ExtCtrls, StdCtrls, ComCtrls;

Typ

TMyThread = Klasse (TThread)
privat
Prozedur Update;
geschützt
Prozedur ausführen; überschreiben;
end;

TMainForm = Klasse (TForm)
Timer1: TTimer;
Prozedur FormCreate (Sender: TObject);
procedure FormClose (Sender: TObject; var Aktion: TCloseAction);
Prozedur Timer1Timer (Sender: TObject);
privat
{Private Deklarationen}
MyThread: TMyThread;
Öffentlichkeit
{Öffentliche Erklärungen}
end;

war
MainForm: TMainForm;

Implementierung

{$ R * .dfm}

Prozedur TMyThread.Update;
beginnen
//
end;

Prozedur TMyThread.Execute;
beginnen
wiederholen
Schlaf (100);
Synchronisieren (Update);
bis zum Abbruch;
end;

Prozedur TMainForm.FormCreate (Sender: TObject);
beginnen
MyThread: = TMyThread.Create (false);
Timer1.Interval: = 1;
Timer1.Enabled: = true;
end;

procedure TMainForm.FormClose (Sender: TObject; var Aktion: TCloseAction);
beginnen
Timer1.Enabled: = false;
wenn MyThread.Suspended dann MyThread.Resume;
MyThread.Terminate;
MyThread.WaitFor;
MyThread.Free;
end;

Prozedur TMainForm.Timer1Timer (Sender: TObject);
beginnen
Wenn nicht MyThread. Suspended, dann MyThread. Suspend else My Thread. Resume;
end;

All dies ist dafür nötig: Ich habe eine animierte Schaltfläche erstellt: Sie zeigen mit der Maus darauf - der Stream wird abgespielt, die Animation wird abgespielt, Sie entfernen die Maus - der Fluss stoppt. Der Benutzer kann die Maus oft tragen, so dass dies zu dem oben genannten Problem führt.
In meinem Programm kann kein Timer anstelle von Streams verwendet werden.
Wenn Ihnen jemand sagt, was los ist, gebe ich ihm meine besten Komponenten (einschließlich einer animierten Schaltfläche). Ich schwöre feierlich.
Ich entschuldige mich für die lange Frage, aber kurz gesagt, es ist unmöglich.
Delphi6, Win98.
Vielen Dank.



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

Suspend / Resume ist in diesem Fall nicht die beste Lösung. Und die Verwendung des Flusses für jede Taste ist ebenfalls schlecht. Sobald Sie jedoch einen Stream benötigen, machen Sie es nicht einfacher: Wenn die Animation gestartet werden muss, setzen wir das Flag, die Ausführungsmethode überprüft dieses Flag, und wenn es gesetzt ist, zeichnet es die Animation. Wenn der Cursor weg ist, setzen wir dieses Flag zurück.
Das einzige Problem bestand darin, dass das Flag durch Aufruf einer der Funktionen Interlocked * geändert wurde. beispielsweise InterlockedIncrement / InterlockedDecrement.

"Ich entschuldige mich für die lange Frage, aber auf keinen Fall kann es so sein."
Alle Fragen wären so lang und ausführlich :)



Seiten: 1 ganze Branche

Forum: "Haupt";
Aktuelles Archiv: 2002.01.08;
Herunterladen: [xml.tar.bz2];

nach oben









Speicher: 0.82 MB
Zeit: 0.041 c
3-21989
Boris
2001-12-06 15:50
2002.01.08
Beim Schreiben einer Abfrage in TQuery werden alle Datensätze geladen.


6-22281
Verona
2001-10-04 12:22
2002.01.08
Nachrichten an E-Mail senden


1-22188
Kunst
2001-12-14 13:09
2002.01.08
Wie lese ich eine große Datei?


3-21957
KMM
2001-11-29 15:31
2002.01.08
Im Laufe des Programms müssen Sie viele Male eine Tabelle erstellen und löschen ...


6-22279
Denis
2001-07-28 22:08
2002.01.08
NMSMTP über Proxy





Afrikanisch albanisch Arabic Armenisch Aserbaidschanisch Baskisch Weißrusse Bulgarian katalanisch Chinesisch (vereinfacht) Chinesische Tradition) kroatisch Tschechisch Dänisch Dutch Englisch estnisch Philippinisch Finnish Französisch
Galicisch Georgisch Deutsch Griechisch haitian Creole hebräisch Hindi ungarisch isländisch Indonesian irisch Italian Japanisch Koreanisch lettisch litauisch Makedonisch Malay Maltesisch Norwegian
persisch Polnisch Portugiesisch rumänisch Russisch serbisch Slovak Slowenisch Spanisch swahili Swedish Thai Türkisch Ukrainisch Urdu Vietnamesisch Walisisch Jiddisch Bengalisch bosnisch
cebuano Esperanto Gujarati Hausa Hmong igbo Javanisch kannada khmer Laotisch Lateinisch Maorisch Marathi Mongolisch nepali Pandschabi Somalisch Tamilisch Telugu yoruba
Zulu
Английский Französisch Deutsch Italienisch Португальский Russisch Spanisch