Auf Funktion warten

lindin

Erfahrenes Mitglied
Hallo, habe noch ein Problem...

Ich bekomme bstimmte Daten vom Server!

Dadurch wird eine Funktion aufgerufen!

Dann werden die Daten in einer Variablen gespeichert, und in einem Fenster ausgegeben!

Wenn ich nun schnell nacheinander Daten bekomme, dann wird die VAriable immer wieder überschrieben, und es wird immer das gleiche im Fenster ausgegeben!

Wie kann ich das machen, daß erst die ersten DAten verarbneitet werden, dann die nächsten usw...

Gibt es eine Möglichkeit, herauszufinden, ob eine Funktion gerade 'im Betrieb' ist
Sodass ich auf das Ende warten kann!
 
Wie kann ich das machen, daß erst die ersten DAten verarbneitet werden, dann die nächsten usw...
Ich würde die Daten in einer Liste oder einem Queue sammeln und dann nach Bedarf dort wieder herausholen und verarbeiten. Mach dir eine Klasse, die ein einzelnes Datenpaket aufnehmen kann (Nicht den Copyconstruktor vergessen!), und verwende z.B. std::list< CMeinDatenpaket >. Mit push_front() und pop_back() kannst du Pakete sammeln und wegwerfen.

Gibt es eine Möglichkeit, herauszufinden, ob eine Funktion gerade 'im Betrieb' ist
Arbeitest du denn mit mehreren Threads?
 
Ich arbeite mit zwei Threads!
Aber es greifen nicht beide Threads auf die Rotine zu!


Also von push_front habe ich in meiner Hilfe nichts gefunden!

Und mit Klassen arbeite ich gar nicht!
Bei std muß ich doch auch noch irgendwie "use std namespace" oder so einbauen, oder?

Und was ist ein Copy-Constructor?

Kann man nicht irgendwie sowas machen wie

while(Funktion arbeitet) wait() oder so?
 
Wie der Kachelator schon gesagt hat, du brauchst eine (threadsafe) Datenstruktur - vermutlich ein Liste oder ein Stack.

Die muss ungefähr so aussehen:

-methode boolean Lock() (wir wollen speichern)
-methode unlock() (fertig mit speichern)
-push(bla value) (Speicherfunktion)
-pop() (Ladefunktion)
-boolean isEmpty() (test ob Wert da)

Speichern funktioniert dann ungefähr so:
Code:
while (!Lock()) {
  wait(1s);
}
push(value);
unlock();

zum Speichern.

Laden würde analog gehen (lock, pop, unlock) - wobei das Lock evtl. eingespart werden kann - das musst du dir aber überlegen. Dann kannst du mit readlock und writelock arbeiten wobei die Funktionen intelligent unterscheiden ob nur eines von beiden oder beides benötigt wird.
 
Also, wollte das jetzt folgendermaßen lösen:

Code:
void funktiondiebeiankunftderdatenvomserveraufgerufenwird(void *data){
    
	static int j=0;
	int i;
	daten im;
	daten *test;
	im=(daten)data;
	test[j]=im;
	for(i=0;i<=j;i++){
		eigentlicheFunktion(test[i]);
		free(test[i]);
	}
}

void eigentlicheFunktion(daten x) {
       -verarbeitung der daten

}

daten ist ein Pointer auf eine struktur!

Kompilieren kann ich das!
Aber beim ausführen des Programms kommt es dann zu der Fehlermeldung:
"test is used without being defined"

Aber ich habe Test doch definiert... oder nicht?
 
So, jetzt habe ich noch eine andere VAriante ausprobiert:

ich habe eine globale variable BOOL test

die setze ich bei Funktionsaufruf auf FALSE!

wenn DAten vom Server kommen, dann habe ich folgende Schleife:

Code:
while(TRUE){
        if (test) {
             	funktion(&daten);
	break;
        }
}

aber das funktioniert auch nicht! Wie kann das sein?
ich warte doch dann bei jedem ankommenden Datenpaket erst auf die VAriable test!
 
Tut mir leid, hab Euch alle umsionst genervt...

Es ist so, daß ich statt ner SendMessage() eine PostMessage verwendet habe...

"The PostMessage function places (posts) a message in the message queue associated with the thread that created the specified window and returns
------without waiting -----
for the thread to process the message. "

ICh bin echt blöd, versteh gar nicht wieso ich das gemacht habe, habe die Fkt eigentlich noch nie verwendet...
 

Neue Beiträge

Zurück