TreeView Baum durchsuchen, ZeitPause

lindin

Erfahrenes Mitglied
Hallo, ich habe folgendes Problem:

Ich habe eine Funktion, die einen Baum nach einem bestimmten Item durchsucht!

Wenn das Item gefunden wird, soll es gelöscht werden!

Ich denke auch, daß sie funktioniert!

Denn wenn die Baumstruktur ziemlich klein ist, dann klappt alles reibungslos, aber ist der Baum größer, denke ich, daß mein Programm mit dem Abarbeiten anderer Funktionen weitermacht, bevor die Suchfunktion einen Rückgabewert gegeben hat!

Gibt es vielleicht eine Möglichkeit auf die Funktion zu warten oder so?

ICh gebe zu, daß die Suchfunktion nicht besonders gut ist, und ziemlich lange braucht, aber eigentlich müßte mein Programm doch auf die Funktion warten ! ?
 
An der Stelle, wo die Funktion aufgerufen wird, wird auch gewartet.

Es kann nur ein anderer Thread weiterarbeiten, der Programmteil, der die Funktion aufruft, bleibt auch da drin, bis diese fertig ist.

Es sei denn:

A) die Funktion ist in einem eigenen bzw. anderen Thread

B) Window Messages werden trotzdem noch weiter versendet (passiert u.a. garantiert indirekt durch deine Such-Funktion)


Was genau bringt dich denn dazu, zu denken, dass andere Programmteile ausgeführt werden?
 
Also meine Suchfunktion sendet meiner Meinung nach keine Messages!

Ich erklär mal kurz, was mein Programm macht!

Es kriegt Daten von einem Server, sagen wir mal Text:

zBsp: Text1

Dieser Text wird in Form eines Items in den Baum eingefügt!

Zu jedem Text kommt vom Server noch ein Status!

Text1--> Status1

Der Text wird je nach Status an einer anderen Stelle in den Baum eingefügt!

Nun kommt die ganze Zeit was vom Server, der Status ändert sich...

Ich durchsuche nun den Baum, und gucke, ob der Text irgendwo im Baum schon vorhanden ist!
Wenn ja, lösch ich ihn an der Stelle, damit ich den Text mit dem ggf neuen Status wieder einfügen kann!

Ich denke, daß mein Programm weitermacht, weil manchmal Text nicht gelöscht wird (der alte) und der neue Text zusätzlich in den Baum eingefügt wird...

so habe ich dann zweimal den gleichen Text mit unterschiedlichen Stati, will den Text aber immer nur mit dem aktuellen Status im Baum haben!

DAs Problem ist, daß es manchmal klappt, was mich zu der Annahme gebarcht hat, daß meine Suchfunktion vielleicht zu langsam ist, und das Programm vor dem Finden des Items weitermacht!

Ich hoffe, man kann das einigermaßen verstehen, was ich hier geschrieben hab...

:)
 
In etwa verstanden, ja.

Wenn die Suchroutine direkt beim lesen der Nachricht vom Server aufgerufen wird, sollte das eigentlich nicht mehrfach aufgerufen werden.

Hast du geprüft (mit Logausgaben etc.) ob das Löschen auch immer klappt? Vielleicht findet die Suchroutine das Item manchmal einfach nicht, und dann bleibt's drin?


Zu den Messages; ich meinte auch nicht, dass du selbst die Messages von der Suchroutine aus sendest, die Memberfunktionen zum Treedurchsuchen verwenden intern Messages, die ihrerseits hin und wieder andere Messages generieren, aber das nur nebenbei. Das sollte kein Problem darstellen.
 
Also ich habe mal zwei Instanzen meines Programmes gestartet, beide kriegen die gleichen Daten vom Server!

Und es ist so, daß es bei einer Instanz z.B. klappt, gleichzeitig bei der anderen aber nicht!

Deswegen versteh ich das nicht...

Hast du geprüft (mit Logausgaben etc.) ob das Löschen auch immer klappt? Vielleicht findet die Suchroutine das Item manchmal einfach nicht, und dann bleibt's drin?

NA klar ist es so, daß das Item manchmal drin bleibt und nicht gefunden wird, das ist ja mein Problem...
 
to lindin,

kannste mal die Stelle zeigen, wo der Vergleich stattfindet? Ich habe da eine Vermuttung, aber ich muss dein code sehen.
 
Code:
HTREEITEM findItem(char *name) {

char buf[TV_TEXT_MAX];
    TVITEM tItem;

/*Maximale "Pfadtiefe" ist 3*/
HTREEITEM hTreeItem,hTreeItem1,hTreeItem2,hTreeItem3,hTreeItem4;
char *ptr;
	
	
hTreeItem = TreeView_GetFirstVisible(hwndTreeView); 
hTreeItem = TreeView_GetChild(hwndTreeView, hTreeItem); 
   /*erste Ebene*/
while(hTreeItem){
   
  hTreeItem2 = TreeView_GetChild(hwndTreeView, hTreeItem);
/*Zweite Ebene --> wichtig unwichtig*/
while(hTreeItem2) {
	tItem.mask = TVIF_TEXT | TVIF_PARAM | TVIF_HANDLE;
	tItem.hItem = hTreeItem2;
	tItem.pszText = buf;
	tItem.cchTextMax = TV_TEXT_MAX;

	TreeView_GetItem(hwndTreeView, &tItem);
                      if ((ptr = strstr(buf, "<")) != NULL) *ptr = '\0';
	if (!strcmp(buf, name)) {
	         MessageBox(NULL,name,"hTreeItem2",MB_OK);
	        return hTreeItem2;
	}
	hTreeItem3 = TreeView_GetChild(hwndTreeView, hTreeItem2);
                     /*dritte Ebene*/
	while(hTreeItem3) {
		tItem.mask = TVIF_TEXT | TVIF_PARAM | TVIF_HANDLE;
		tItem.hItem = hTreeItem3;
		tItem.pszText = buf;
		//MessageBox(NULL,buf,"hTreeItem3find",MB_OK);
		tItem.cchTextMax = TV_TEXT_MAX;
		TreeView_GetItem(hwndTreeView, &tItem);
                                           if ((ptr = strstr(buf, "<")) != NULL) *ptr = '\0';
		if (!strcmp(buf, name) ) {
			MessageBox(NULL,jid,"hTreeItem3",MB_OK);
			return hTreeItem3;
		}   
                        hTreeItem3 = TreeView_GetNextSibling(hwndTreeView, hTreeItem3);
	}
	hTreeItem2 = TreeView_GetNextSibling(hwndTreeView, hTreeItem2);
}
hTreeItem = TreeView_GetNextSibling(hwndTreeView, hTreeItem);
}

return NULL;
}


also hinter name steht der status in '<>', deswegen muß das noch abgetrennt werden!
 
Dann mache ich in der Funktion, in der ich neue Items einfüge :

Code:
if (hTreeItem=findItem(name)){
	//MessageBox(NULL,name,status,MB_OK);
	TreeView_DeleteItem(hwndTreeView, hTreeItem);
}

becor ich das neue Item einfüge!
 
Ich vermute mal, dass TreeView_GetFirstVisible das Problem ist. Das holt das erste sichtbare TreeItem. Wenn der TreeView aber nach unten gescrollt ist, fängt der auch in der Mitte des Trees an, geht also gar nicht den kompletten Tree durch.

Ich würde da mit TreeView_GetRoot arbeiten.
 
Hm, das kann natürlich sein, ich dachte, da gäbe es kein Problem mit der Sichtbarkeit, ich dachte, mit GetFirstVisible ist das erste Element in dem Baum gemeint, egal ob im Fenster sichtbar oder nicht, also ich dachte, das bezieht sich darauf, ob der Baum aufgeklappt ist oder nicht...

Ich probier das mal aus, das dumme ist nur, daß ich erst stundenlang probieren muss, bis der Fehler 'endlich' :( wieder auftritt...
 

Neue Beiträge

Zurück