Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Borland C++ Builder » Timer Problem

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
15.09.2005, 13:47 Uhr
~Sarah1
Gast


Hallo,

ich habe ein Problem mit meinem Timer. In dem Timer werden ständig Funktionen aufgerufen zur Datenübertragung mit der seriellen Schnittstelle. Das klappt auch einwandfrei.
Jetzt muss ich allerdings die Timerfunktion unterbrechen, wenn ich z.B eine Taste drücke.

Wenn ich den Timer einfach nur Enabled = false setze, arbeitet er trotzdem noch seine Funktion (OnTimer) bis zum Ende ab.
Er muss aber sofort abbrechen, sobald ich die Taste gedrückt habe, egal was er gerade macht.
Gibt es noch eine andere Möglichkeit meinem Timer zu stoppen als ihn auf Enabled = false zu setzen ?

Gruß
Sarah
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.09.2005, 13:58 Uhr
Reyx
IT-fetischistischer Wurstsalat mit rostigem Berghorn
(Operator)


Da würde mir nur einfallen, den Umweg über eine Variable zu machen.

Du deklarierst dir einfach eine Hilf-Variable

C++:
bool KillTimer = false;


Nun brauchst du sie bei Tastendruck nur noch auf true schalten, und vor jeder Teilaktion des Timers prüfen, ob sie true ist, und falls ja, den Timer deaktivieren und die Variable wieder auf false schalten.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.09.2005, 14:18 Uhr
~Sarah1
Gast


Wenn das nur so ein paar Möglichkeiten wären,um auf die Variable abzufragen, aber die muss ich nun ständig abfragen.

Die Lösung mit ner Variablen ist mir auch schon eingefallen, aber das ist ja nicht gerade eine effektive Lösung.
Gibt es nicht eine Funktion für den Timer, so etwas wie STOP ??
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.09.2005, 11:05 Uhr
Reyx
IT-fetischistischer Wurstsalat mit rostigem Berghorn
(Operator)


Hmm... du könntest höchsten versuchen, den Timer zu resetten:

C++:
delete MyTimer;
MyTimer = new TTimer(/* hier ggf. ein Parameter */);


Aber ob dass so klappt weiß ich nicht, und sauber ist diese Lösung auch nicht wirklich.

Dieser Post wurde am 17.09.2005 um 11:05 Uhr von Reyx editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
17.09.2005, 11:38 Uhr
Spacelord
Hoffnungsloser Fall


Schau dir mal die Funktionen CreateTimerQueue,RegisterWaitForSingleObject und CreateTimerQueueTimer an.
Damit kannst du in bestimmten Intervallen deine benutzerdefinierte Funktion aufrufen lassen oder aber auch ein Event nutzen um die Funktion aufzurufen.
Der Funktion wird mitgeteilt ob der Aufruf aufgrund eines Events oder durch Ablauf der Zeit betreten wird.
Damit sollte sich was machen lassen.
Die Timerfunktion läuft übrigens in nem eigenen Thread um den sich komplett Windows kümmert.
Alternativ dazu gibt es irgendwo im Netz auch nen Artikel von Jeffrey Richter.....
...........................

Gefunden:
www.microsoft.com/msj/archive/SFFF.aspx

Vom Prinzip her wird hier auch nen Worker Thread erstellt,der in deinem Fall, deine Timermethode abarbeiten würde.
Um den Thread aber jederzeit stoppen zu können ohne dauernd irgendeine Variable abzufragen bedient er sich eines kleinen Tricks.
Ganz grob funktioniert es etwa so:
Der Workerthread arbeitet mit Speicher der vom primären Thread,über VirtualAlloc belegt wurde.Wenn der Thread jetzt beendet werden soll gibt der primäre Thread diesen Speicher mit VirtualAlloc wieder frei.Beim nächsten Zugriff auf den Speicher innerhalb des Workerthreads gibt es ne AccessViolation die mit einem entsprechendem Exceptionhandling abgefangen wird und eventuelle Aufräumarbeiten ausgeführt werden.
Ist natürlich nen ziemlicher Aufwand,aber wer besonderes haben möchte muss besonderes machen....

Mit nem einzelnen Thread wirst du dein Ziel wohl nicht erreichen.Mal angenommen dein Thread ist damit beschäftigt deine Timermethode abzuarbeiten und innerhalb der Methode wird ständig eine Statusvariable abgefragt.Wer sollte diese denn ändern während du in der Methode bist?

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.09.2005, 13:21 Uhr
Veasel



wär doch auch möglich, dass du dafür threads verwendest.
einen in dem dein timer läuft und einen, der darauf wartet, dass eine taste gedrückt wird und du dann den timer resetest!

aber die variante mit der variable ist auch nicht schlecht...

Veasel
--
MFG Veasel
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Borland C++ Builder ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: