1) Zähleranzeige / 2) Variable binär handeln

sTEk

Erfahrenes Mitglied
Hallo!
Irgendwie bin ich blind oder so...aber ich finde einfach keine Lösung für mien Problem:

Ich lasse eine Variable in einer for-Schleife hochzählen (um mal später ein paar Pages aus einem µC zu lesen) und wollte mir nun erst einmal den Zähler anzeigen lassen, damit ich es sehe alle paar Millisekunden der nächste Wert..
Das alte C++ gewohnt dachte ich, das klappt so einfach - tja, schief gewickelt. :/

Hier mal mein Code:
Die Zeitfunktion
Code:
  void CCOMDialog::Warte(int msek) 
  {	
  	DWORD zeit2;
  	DWORD zeit1=GetTickCount();
  	zeit1=zeit1+msek;
  	do {
  	zeit2=GetTickCount();
  	
  	}
  	while (zeit2<zeit1);
  }

Die Schleife: (m_COM_Statusi ist dabei ein Integerwert)
Code:
  	int i;
  
  	for (i=1; i<4001; i++)
  		{
  		m_COM_Statusi=i;	
  		UpdateData(FALSE);
  		Warte(10);    
  		}

Leider wird meine Anzeige eben nicht permanent geupdated, sondern das Progrämmchen verabschiedet sich und das Fenster reagiert nicht mehr. Lasse ich den Warte(x)-Aufruf weg, wird lediglich die 4000 angezeigt.
Wenn ich den Code abändere und m_COM_Statusi als CString behandle, dann weiß ich leider nicht einmal, wie ich den int-Wert dort hinein bringen soll. :/


Dann habe ich noch eine weitere Frage:
Ich lese meine Daten als String von der COM-Schnittstelle. In einenm Fall kommen diese in 64Byte-Paketen rein und ich speichere die (hoffentlich mal) ab. Ich benötige jedoch Zugriff auf jedes einzelne Byte - und das am besten in der Hex- oder Binärform. Wie kann ich das anstellen?

Danke für Eure Antworten!
 
Zuletzt bearbeitet:
Also:
Für Zugriffe auf den Com Port verwendest du die datei dos.h.
Da gibts die Funktionen in() und out().
Wie die genau funktionieren weiss ich net aber es gibt sie.
Einen Integer Wert in einen Char bekommst am besten mit
sprintf(char *buffer, const char*, .....)
bsp:
Code:
char *buff;
int b = 12;
sprintf(buffer, "Wert: %i", b);
Ich hoffe das hilft ein wenig !
rya.
Scorcher24

edit:
eider wird meine Anzeige eben nicht permanent geupdated, sondern das Progrämmchen verabschiedet sich und das Fenster reagiert nicht mehr.
Lass ihn doch in einem extra Thread zählen !
--> MSDN --> CreateThread(); oder CreateThreadEx();
 
Zuletzt bearbeitet:
Die Kommunikation mit dem COM-Port funktioniert einwandfrei - habe die Klasse CSerialPort genutzt.

Der Code zur Umwandlung funktioniert leider nicht...das Programm stürzt mit einem Speicherzugriffsfehler ab. (habe in der Anweisung aus buffer buff gemacht)

Der Vorschlag mit den Treads ist so eine Sache - in meinem Buch schreiben sie, dass es erst mal ziemlich kompliziert ist, diese Treads zu managen und zudem ist es nicht genau das, was ich brauche, denn das was das Programm dort macht muss der User abwarten.
 
moin


SChreibst du eigentlich ne Konsolenanwendung oder eine Dialogfeld basierende mit MFC?!

Ich nehme mal an das zweite.

Rufst du die Funktion im Hauptdialogfeld oder in nem anderen auf?


Wenn de die Warte() Funktion weglässt steht die da nur 400 weil der so schnell fertig ist, aber das weisste sicher.
Anstatt deine eigene Wartefuntkion zu nehmen versuch doch mal die Sleep() aus der windows.h, vielleicht hilfts.

mfg
umbrasaxum
 
@sTEk
Code:
char *buff;
int b = 12;
sprintf(buffer, "Wert: %i", b);
du solltest Speicher beretistellen für den buffer, sonst erhältst du einen Zugriffsfehler
Also
Code:
char buff[32];
int b = 12;
sprintf(buff, "Wert: %i", b);
 
@dorado
Danke Dir...hatte ich kurz nach meinem Post auch bemerkt - manchmal ist man aber auch blind. ;)

@umbrasaxum
Ich schreibe eine MFC-basierende SDI, da öffne ich modal mittels Menüpunkt einen Dialog und dort soll das Ganze stattfinden. Mittels eines Buttons (also mit OnButton) starte ich die Vorgänge.
Das er zu schnell ist dachte ich mir auch schon, aber leider stellt er wirklich nur die letzte Zahl dar, denn meine Warteschleife scheint zu funktionieren, bei 4000 Durchgängen wartet er 40s, also die korrekte Zeit.
Ich denke mal, dass es was damit zu tun hat, dass ich die Vorgänge mit einem Button starte und er in dieser Anweisung OnButton nur einmal die Felder updated.
Wie kann ich das nun umgehen?

Lösung: Ich habe es endlich! Ein UpdateWindow(); gestattet mir endlich, alle Werte zu sehen. Juchu!

Nachtrag:
Die Sleep()-Funktion hatte ich auch schon ausprobiert - mit gleichem Ergebnis - , allerdings wird von der in verschiedenen Quellen abgeraten, da sie wohl die gesamte Anwendung in den Ruhezustand versetzt.
 
Zuletzt bearbeitet:
Das (dein) Problem ist, dass bei Windows alles über die MessagePump (dieser GetMessage/TranslateMessage/DispatchMessage-Klumpatsch) läuft. Diese muss immer wieder regelmässig durchlaufen werden, damit die einzelnen Fenster auch alles mitkriegen.

Wenn du jetzt so eine dicke Warteschleife aufrufst, dann bleiben die ganzen Nachrichten liegen und es sieht aus, als ob dein Fenster nicht mehr reagiert.

Du kannst jetzt entweder in deine Warte-Funktion eine kleine lokale MessagePump einbauen (nicht so doll, ausserdem muss man auf ein evtl. Programmende reagieren) oder deine Abfrageroutine in einen Thread packen.
Das ist dann unter MFC gar nicht soo schwierig, du musst nur drauf achten, dass dein Thread sich auch sauber beendet, wenn du das Programm zumachst.
 
Zurück