Zum Inhalt springen

kathi008

Mitglieder
  • Gesamte Inhalte

    150
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von kathi008

  1. Hallo Zusammen! Hab mit dem AutoResetEvent gelöst. Funktioniert soweit. Wirklich in Echtzeit die Daten einzulesen habe ich dann doch nicht geschaft, fehlen nur ein paar Millisekunden. Dadurch wächst der Berg an Daten im Empfangspuffer der SerialPort Klassen. Hab mit dem DiscardInPuffer gelöst. Dadurch geht zwar einiges verloren, aber bei der Funktion ist es nicht schlimm. Ein anderes Problem: Meine Anwendung beinhalt eine DataLogger Funktion. Hier werden die Daten in einem RichTextBox dargestellt, welcher nach bestimmter zeit geleert wird und die Daten in einer Datei gespeichert werden. Das Problem: Es wird nur die Anzeige von dem RichTextBox geleert, der allocierter Speicher bleibt aber beibehalten und wird erst mit Beender der Anwendung freigegeben. Wenn die Anwendung Tage läuft, reicht irgendwann der Speicher nicht mehr aus. Das zerstören des Steuerelemets hat nix gebracht, da der Speicher anscheinend der gesamten Anwendung zugesichert wird. Hab mit dem Memory Profiler beobachtet: Solange der Text dem RichTextBox hinzugefügt wird, steigen Gen0 - Gen3 permanent. Schließe ich die Form mit dem RichTextBox, bleibt es auf der letzten Höhe und fällt nicht zurück. Beim erneuten Starten steigt das Ganze ab dem letzten Punkt weiter! Wie kann ich zusammen mit dem leeren (evtl. Zerstören) des RichTextBoxes auch den Speicher freigeben? Danke im Voraus.
  2. Hallo zusammen! Ich habe nun meine Anwendung noch mal gründlich durchgesehen und neu aufgebaut. Das Auslagern der Kommunikation in eine extra Anwendung hat mir geholfen diese von dem Hauptprgramm richtig zu trennen. Ich habe nun die Kommunikation in einen Backgroundworker(BGW1) verpackt, welcher wiederrum aus einem anderen Backgroundworker(BGW2) aufgerufen wird. BGW1 erledigt reine Kommunikation. BGW2 entscheidet, wie mit den Daten weiterverfahren wird und löst ein paar Events aus, auf die im Hauptfenster reagiert wird. Soweit so gut. Es funktioniert nun auch in Echtzeit. Danke für die Infos. Ein neues Problem: BGW1 wird durch Usereingaben gestartet. Innerhalb der Do_Work() läuft eine 'endlose' while- Schleife, die auch nur durch Usereingaben abgebrochen wird. In der while- Schleife steht kein Code, weil die Kommunikation über SeriellPort- Klasse und deren Events läuft. Ich muss halt den BGW1 irgendwie blockieren, damit er weiterläuft. Das eigentliche Problem: die while- Schleife nimmt bei meinem DualCore Processor 50% von den CPU- Ressourcen. Die Anwendung sollte aber mehrmals auf einem Rechner gestartet werden können. Damit wird aber der PC lamgelegt! Gibt es ein Ersatz für die While - Schleife? Hab in MSDN AutoResetEvent gefunden... Kann man mit Hilfe von AutoResetEvent den Thread solange blockieren, bis der User den Befehl zum Schließen gibt? Wird dabei die SeriellPort Klasse mit deren Events auch blockiert?
  3. Hallo! Meine Anwendung dient zur Parametrierung eines Gerätes, welches als Master am Seriellen Bus angeschlossen ist. Das heißt: dieses Gerät schickt regelmäßig eine Anfrage an alle angeschlossenen Geräte, auch an den PC. Die Reaktionszeit auf die Anfrage beträgt 20 -60 ms. Schafft der PC in dieser Zeit nicht zu antworten, soll er auf die nächste Anfrage warten und dann die Anwort wegschicken. Die Daten werden per SeriellPort- Klasse eingelesen. Die Klasse puffert die Daten, sodass, wenn der PC die Anfrage abholt, eigentlich schon andere Geräte angefragt werden. Wenn nun der PC antwortet, kommt es zur Kollision. Die Kommunikation lief anfangs in einem Backgroundworker, bei dem ich auch die Priorität 'Echtzeit' eingestellt habe. Leider brachte es keine Verbesserungen. Erst als ich extra eine Anwendung dafür erstellt habe, ging es. Guybrush Threepwood Du hast natürlich Recht, das muss ich noch ausprobieren. Aber hier hat der Windows die Chance die verschiedenen Prozesse auf verschiedene Kernel zu verteilen, was bei einer einzigen Anwendung schwierig wäre.
  4. Klar war die Kommunikation in einem Backgroundworker ausgelagert. Das Problem ist: Der Windows reserviert für die gesamte Anwendung bestimmten Speicherbereich und händelt ja die Threads intern nacheinander, abhängig von der Priorität der Threads, ab. Wenn der User ein Mausklick auf eine Form macht, bekommt Diese ganz kurz die höchste Priorität, so dass das Programm sich nicht aufhängt. Dadurch werden alle anderen Thread kurz abgebremst. So habe ich das zumindest verstanden. Wenn ich nun das in eine extra Anwendung auslagere ohne Forms und Grafik, so arbeiten die zwei Anwendungen unabhängig von einander und die Hintergrundanwendung wird durch den User nicht gestört.
  5. Hallo! hab eine Lösung gefunden.:bimei Ich erstelle einfach eine zusätzliche Anwendung, welche nur das Senden und Empfangen am Seriellen Port übernimmt. Die Hauptanwendung und die Hintergrundanwendung lasse ich mittels IPC-Kanal miteinander kommunizieren. Wer aber eine elegantere Lösung parat hat nur her damit! Das Thema kann dann geschlossen werden.
  6. Hallo Zusammen! Gleich zu meinem Problem: Mein Programm hängt an einem virtuellen COM Port(USB) als Slave und horcht den Bus ab. In regelmässigen Abständen kommt eine Anfrage vom Mastergerät an die Software. Wenn nötig antwortet die Software dem Mastergerät. Funktioniert soweit auch gut. Das blöde ist, die Daten kommen bei der Software ungefähr mit 1 Sekunde verspätung, was bei 19200 Baud zimlich viel ist. Wenn die Software dann Antwortet, kommt es öfters zu Kolisionen am Bus, da Mastergerät schon andere Slaves anfragt. Hat jemand ein Rat wie ich das ganze in Echtzeit gestalten kann? Ich nutze c# .NET2005 die Software hat auch mehrere Fenster, in welchen die Daten dargestellt werden. Die Kommunikation ist mit SerialPort Klasse realisiert und ist Interrupt gesteuert.
  7. So habe ich es am Anfang gemacht, als ich dann das Problem beheben wollte hab ich es so aufgerufen: cwnd = AfxBeginThread(ThreadFunc,this); pAktiveThread[1] = cwnd->m_hThread; [/PHP] Der Handle von dem Thread liefert STILL_ACTIVE (259) Der Rückgabewert der Funktion WaitForMultipleObjects() ist 0xFFFFFFFF und GetLastError lierfert 6, also Invalid Handle--> nehme an, dass es daran liegt dass das Fenster nicht mehr existiert und der Thread dementsprechen auch... ich danke dir für die schnellen Antworten, ich werde mein Programmkonzept noch mal komplett überdenken müssen:rolleyes:, das es nicht direkt auf die FormView greift... und die CEvent und CSingleLock schau ich mir auch noch genau an... ich sag bescheid, wenn ich es geschaft habe:hells:... wird aber warscheinlich eine Weile dauern...
  8. Das Programm ist so aufgebaut: es sind mehrere Threads, die laufen aber nie gleichzeitig, je nach Aktion des Benutzers wird einer oder anderer gestartet, und wenn der fertig ist wird der nächster gestartet usw... Ich starte die Threads so: AfxBeginThread(ThreadFunc,this); Die ThreadFunk: UINT CDT05View::ThreadFunc(LPVOID param) { CDT05View* pAppView = (CDT05View*)param; if(modus == 1) { pAppView -> doThreadEvents1(); return 0; } if(modus == 2) { pAppView -> doThreadEvents2(); return 0; } //usw... return 1; }[/PHP] Wie mache ich das? Also ich glaub es wartet schon, nur es ist so: Die Thread sind in der FormView, da es die AusgabeThreads sind, diese greifen immer auf die Steuerelemente der FormView zu... nun wenn ich die Anwendung mit dem SchließenKreuz beende wird das Fenster zerstört, aber der Thread, der gerade irgendwo inmitten der Schleife ist wird nicht gestoppt...und beenden kann ich das nach dem Zerstören des Fensters auch nicht, anscheinend existiert es auch nicht mehr... nur das es noch paar PostMessages an das Fenster kommen, wo es zu Assertion kommt, was auch klar ist... Meine Frage war: Kann ich irgendwie das Zerstören des Fensters abfangen, dass ich das Thread ordentlich beenden kann bzw. bis es die Schleife abgearbeitet hat und von selber schliesst...? Hab mit PostNCDestroy versucht, aber da ist das Fenster nicht mehr da... und OnClose greift noch später... Hab Zwischenlösung gefunden: ich deaktiviere das SchließenKreuz, so das der Nutzer gezwungen wird die Verbindung bzw. das Thread mit dem Button zu beenden, erst dann wird das Kreuz wieder aktiv:rolleyes:
  9. Hallo Forum... hab folgendes Problem: hab eine MFC-EXE Anwendung mit FormView und mehreren Threads die beim Klick auf VerbindenButton in der Form nacheinander Starten... funktioniert soweit... Wenn ich die Verbindung mit dem Button trenne und die Anwendung beende--> is ok Allerdings wenn ich die Anwendung mit dem Schliessen Kreuz beende, wird das Fenster sofort zerstört, aber der letzte Thread nicht beendet... Meine Farage: Wie kann den Thread beendetn bzw. auf das Beenden warten, hab schon mit WaitForMultipleObjects bzw. WaitForSingleObject versucht, aber irgendwie wartet die Anwendung nicht, hab schon ein Array mit Thread-Handles angelegt, um zu sehen, welche Threadsnoch aktiv sind. Ein Thread hat dann immer Status STILL_ACTIVE, wenn ich den zwingend schliessen will mit TerminateThread() kommt ein Errorcode 6 --> Invalid Handle Was soll ich tun???
  10. Danke, allerdings ist es nur für Files gedacht, ich habe aber meine Daten, ich wollte eigentlich nur diesen Dialog als vorlage für meine Kopierfunktion. Geht das nicht?
  11. Hallo Forum, hab wieder mal ein Problem: Ich möchte aus meinem Program, das aus mehreren Dialogfenstern besteht, die Daten hin und her kopieren, dabei wollte ich Standart Windows Kopierdialog nutzen, so einen, wenn man irgendeine Datei bzw Ordner kopiert, kommt doch da ein Kopierendialog mit dem Pogress-Laufbalken. Wie komme ich an den ran? Welches Class hat es? Hab bis jetzt nichts gefunden, muss doch sowas wie für Farbendialog ( CColorDialog) geben. Danke schon mal.
  12. ich möchte anhand der checksumme feststellen können, ob die Datei geändert worden ist oder nicht. Die Checksumme ist doch eindeutig dafür, und das Datum wollte ich nicht nehmen, weil es könnte ja sein, dass die Datei erneut ohne irgenwelchen Änderungen gespeichert worden ist. Was ist ein Eingabewert eines Hashes - die Checksumme? Wenn ja, wo wird die dann gespeichert, kann man die (nur) auslesen und wie? Bin zimmlich neu in diesem Bereich:(
  13. Hallo, das Problem habe ich jetzt auch, nur dass ich die Checksumme nicht nur erstellen, sonder diese auch aus einer Datei auslesen will. Wie lese ich eine Checksumme, die vom System beim Erstellen erzeugt worden war, aus einer bestehender Datei aus? Wie ersetze ich diese durch meine Checksumme? Ich benutze VC++, MFC, ReadFile und WriteFile. Wäre sehr dankbar, wenn mir jemand helfen könnte:rolleyes:
  14. hab schon gefunden:bimei GetModuleFileName(NULL, buf, 255); CString strPfad; strPfad.Format("%s", buf); int nTmp = strPfad.ReverseFind('\\'); strPfad.Delete(nTmp,strPfad.GetLength()-nTmp); [/PHP]
  15. Hallo Forum, hab wieder mal ein Problem: Weiss jemand, wie ich aus .exe -Datei eingenen Pfad feststellen kann, quasi wo das Programm abgelegt ist?
  16. Danke dir, das wusste ich nicht:hells:. Guybrush Threepwood dir auch danke. :uli
  17. Guten Morgen! Guybrush Threepwood ich danke dir, es funktionier wunderbar! Hab aber noch eine Frage: wie stelle ich fest, dass gerade z.B. Edit1 Focus hat? Edit1.GetFocus() liefer den Focus auf gesamtes Fenster!
  18. Habe ich schon versucht auch schon mit OnKeyDown, allerdings kommt das Programm nicht mal in die Funktion rein, sollte es aber, sobald eine Taste gedrückt worden ist, oder? Ich nehme an, es liegt daran, dass es eine Eigenschaftsseite ist.
  19. :cool: Hallo Forum, hab wieder mal eine Frage: Ich habe einen Eigenschaftsblätterdialog von CPropertySheet und CPropertyPage abgeleitet. Auf einer Page sind mehrere CEdit Eingabefelder. Jetzt möchte ich, wenn es in einem Feld die Eingabe(eine Kommazahl z.B. 234.53) gemacht worden ist, diese sofort abfangen und die MemberVariable aktualisieren. Nun ich hab mit OnChange versucht, da wird es aber schon bei der ersten Zahl aktualisiert, ich möchte aber, dass es erst nach dem Drücken der Entertaste gemacht wird. Wie mache ich es? Ein Button kommt nicht in Frage:(
  20. Danke euch allen, ich hab jetzt so, wie Klotzkopp gesagt hat, gemacht. Bei starten des Programms wird die abfrage als Thread gestartet, aber später aus dem Slavethread als normale Funktion, es klappt wunderbar.
  21. Hallo, Wenn ich für die Abfrage eine Funktion und nicht Thread benutze, hängt sich mein kompletes Programm auf! Ich will ja nur den SlaveThread, der die Daten am Port verwaltet, anhalten, um Port frei zu kriegen, und nicht das ganze Programm!
  22. Hallo zusammen! Die Vorgeschichte: Ich hab ein Programm, das die Daten vom COM-Port einliest. Das Gerät, das die Daten schickt kann zwei verscheidene Zustände haben: Master und Slave. Wenn ich mein Programm starte und das Gerät sagt, der ist Master alles OK. Wenn das Gerät sagt aber, dass es Slave ist, muss ich alle paar Sekunden nachsehen, ob er vielleicht doch in Masterzustand übergegangen ist und die Daten als Master sendet. Mein Problem: Ich habe 3 Threads, die mit AfxBeginThread() aufgerufen werden: Der eine ist für die Abfrage Master/Slave, der dann den einen von den anderen beiden Thread startet: entweder Masterthread oder Slavethread. Aus dem SlaveThread rufe ich den Abfragethread alle paar Sekunden wieder auf, um zu sehen ob es doch Master ist(AbfrageThread liest die Daten eine bestimmte Zeit ein und wertet diese aus, die Zeit wird mit SetTimer() gesteuert). Für die Zeit, wo der AbfrageThread arbeitet, sollte der SlaveThread angehalten werden -> WIE MACHE ICH DAS BLOS? Die Thread werden alle in der View abgearbeitet, da es eine Dialoganwendung ist mit FormView. Habe schon mit CEvent und Lock()/Unlock() versucht, da hängt aber das Program an der gleichen Stelle und tut nichts! WaitForSingleObject hilft mir auch nicht weiter, da das ganze Programm aufgehalten wird. Bin sehr dankbar, wenn mir jemand helfen kann.
  23. Ich habe mein Fehler gefunden, war mein Fehler, hab die dBaud nicht sauber zurückgegeben:upps, vielen danke für deine Hilfe trotzdem:D
  24. ja, wenn es im Code gesetzt ist funktioniert es, und der MessageBox zeigt in beiden Fällen z.b. 'COM3, Länge 4'. Mich wundert es auch, warum es nicht funktioniert, bin verzweifelt!

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...