Zugriff auf Form trotz while-schleife



  • Hab meinen alten Account wiedergefunden oO, der Gast von oben bin ich *gg*

    Also das mit dem TTimer find ich umstaendlich. Meine Hilfe in Borland6.0 spuckt da nicht so viel verstaendliche Materie aus.

    Gruss Krugman



  • Fincki schrieb:

    Evtl. wäre auch der Befehl Application->ProcessMessages() einen Blick wert.

    Das ist die Loesung!



  • Hallo,

    Der Timer ist doch einfach.

    Du nimmst den Timer und schreibst dort rein, was er in den bestimmten abständen machen soll.

    Dem entsprechend - man soll ja mit haekchen die zeitspanne auswählen - machst du bei 2 sekunden

    Timer->Interval = 2000;
    

    bei 3 sekunden dann

    Timer->Interval = 3000;
    

    und so weiter.
    Es muss dort 3000 heissen, weil der interval in millisekunden angegeben wird.

    Gruß
    MWJK



  • Jap, das hab ich auch verstanden, nur wollte ich nicht die HW_Timer oder was das ist benutzen. Und mit Switch wollte ich auch nicht arbeiten. Das mit Application->ProcessMessages() ist die beste Variante.
    Damit werden alle Interrupts verarbeitet.

    Gruss Krugman



  • Krugman schrieb:

    Jap, das hab ich auch verstanden, nur wollte ich nicht die HW_Timer oder was das ist benutzen.

    Was will uns der Dichter damit sagen?

    Krugman schrieb:

    Und mit Switch wollte ich auch nicht arbeiten. Das mit Application->ProcessMessages() ist die beste Variante.

    nein, die schlechteste.



  • Na dann moechte ich gerne wissen warum. Ich habe nicht das Fachwissen dafuer und brauche nur die Funktion, dass meine Eingaben in der GUI uebernommen werden.

    Zum HW_TIMER, dies habe ich im Durchforsten der - in diesem Fall fuer meine Begriffe knapp - Dokumentation herausgelesen.

    Und so wie es jetzt lauft, laeuft es super. Deswegen bin ich doch zufrieden und das ist es doch was einen gluecklichen User ausmacht 😉
    Ich lasse mich aber gerne ueber eine besseren Alternative aufklaeren, nur fand ich meine jetzige voellig ausreichend.

    Beste Gruesse Krugman



  • Krugman schrieb:

    Na dann moechte ich gerne wissen warum.

    Da du von Interrupts sprichst, gehe ich davon aus, dass du aus der Embedded-Ecke kommst. Dann erklär ichs dir mal so: Jedes Event welches du für eine Komponente beschreibst ist ein Interrupt. Deshalb sollte für diese Events das selbe gelten wie für INterrupts: Halte sie kurz und schnell.
    Du ermöglichst mit Application->ProcessMessages sowas wie nested Interrupts. Das führt dazu, dass du im dümmsten Fall spätestens bei komplexeren Appliaktionen schlecht vorhersehbares Vorhalten erzeugst und im dümmsten Fall den Stack füllen kannst, wenn mehrere Nachrichten nicht mehr zurückkehren.

    Krugman schrieb:

    Zum HW_TIMER, dies habe ich im Durchforsten der - in diesem Fall fuer meine Begriffe knapp - Dokumentation herausgelesen.

    Ich finde die Dokumentation der Klasse TTimer eigentlich äusserst umfangreich ( http://www.junix.ch/bcb/help/hilfe.html )

    Krugman schrieb:

    Und so wie es jetzt lauft, laeuft es super. Deswegen bin ich doch zufrieden und das ist es doch was einen gluecklichen User ausmacht 😉

    Genau das ist das was den Bastler vom Entwickler trennt. Wenn schon was Quick & Dirty machen, dann aber mindestens die sauberste der gleichaufwendigen Lösungen wählen! Spätestens bei komplexeren Applikationen wird dir ProcessMessages() über kurz oder lang in den Fuss schiessen.



  • Okay, ich hab jetzt noch ein anderes Problem, dieses hatte ich eigentlich in einem anderen Thread beschrieben, wurde aber geschlossen.

    Jetzt schreib ich es hier rein, da es ja fast dazugehoert.

    Ich hab eine Whileroutine (von externem Programm terminierbar) in meine OnShow Funktion reingepackt.

    Vorheriges Problem war, dass "Nicht-Anzeigen" des:
    1. ganzen Fensters
    und
    2. in der Taskleiste,
    da er in der CreateFunktion diese Funktion ausfuehrte.

    Ich hab dies nun auf Rat in die OnShow-Funktion gepackt, mit fast dem gleichen Ergebnis. Beim starten wird das Fenster nicht angezeigt, dafuer aber in der Taskleiste. Eigentlich waere ich damit schon zufrieden, obwohls Mist ist, aber wenn das Programm mittels exit(); beendet werden soll, dann kommt eine Fehlermeldung, dass er den Visible-Status nicht aendern kann. Dies liegt wohl mit OnShow zusammen, bin ich der Meinung.

    Kann mir da irgendwer nen Tipp geben?

    Gruss Krugman

    PS: Ein anderer Vorschlag, wo direkt in der WinMain zu hantieren geraten wurde, wurde noch nicht bearbeitet. Wenns denn nicht anders geht muss ich es damit mal versuchen .. 😞



  • Der wurde geschlossen, weil hier der Grundsatz nur eine Frage je Thread gilt.

    Zu deiner Frage, da benutzt du wohl am besten einen Timer mit einem Intervall von einen Millisekunde. Der Timer wird dann automatisch gestartet, wenn das Formular komplett geladen ist. Dann deaktivierst du den Timer und machst deine Aktionen.



  • Krugman schrieb:

    Ich hab eine Whileroutine (von externem Programm terminierbar) in meine OnShow Funktion reingepackt.

    Was soll die Funktion denn treiben? Ausserdem widerspricht doch die Verarbeitung länger andauernder BEfehle innerhalb der Nachrichtenbearbeitungsschleife doch exakt dem was ich oben geschrieben ahbe? Oder hast du das gar nicht erst gelesen?



  • Doch hab ich! Und ich finde dein(e) Argument(e) auch gut. Habe ich nichts gegen einzuwenden. Nur moechte ich nur gerne wissen ob man mein Prob loesen kann... ohne mit Timer, threads zu arbeiten. Wenn das ueberhaupt nicht moeglich ist, DANN muss ich eine andere Alternative finden.

    Dieses kleine Programm soll doch nur am Anfang sichtbar sein und dann das machen wozu es da ist. Es wird darauf nicht vom User zugegriffen. Die Daten die es "verarbeitet"(handled) werden von einem anderen Programm verarbeitet.

    Und nebenbei, ich komme nicht aus der Embedded-Ecke, ich studiere Nachrichtentechnik im 6. Semester und da haben wir nicht allzuviel mit Programmieren am Hut. Es wird zwar von uns verlangt im Beruf, aber in der Vorlesung gab es nur C. Von daher muss ich mich auch erstmal reinarbeiten.
    Nebenbei beschaefitge ich mich mit Matlab(ka ob da was mit Embedded drin ist), Borland(Praktikabedingt) und C++.

    Das mal dazu 😉

    Gruss Krugman



  • Nun ja, die Lösung wäre eben, einen Timer, oder einen Thread einzusetzen. Beides schließt Du für Dich aus, andere sinnvolle Lösungen gibt es nicht. Also wirst Du weiterhin mit Schleifen an falschen Stellen frickeln müssen. Aber gewarnt haben wir Dich. 😉



  • Ok, danke. Ich muss mir jedenfalls ueberlegen, ob es sinnvoll ist, mit dem Timer zu arbeiten. Was es ja ist, nur momentan laeuft es mit ProcessMessages.

    Danke fuer Kritik und Ratschleage. Wenn ich weitere Fragen dazu habe, werd ich was posten 😛

    Gruss Krugman


Anmelden zum Antworten