![]() |
Thread, aber wie einbauen?!
Hi,
ich habe folgendes Problem: Ich arbeite mit der TICQClient Komponente, mit der ich Usernamen anhand von UINs auslesen möchte. Dies muss ich für eine Liste von Usern machen (sagen wir mal 10 Leute). Ich weiss, dass ich hierbei Threads anwenden muss, denn ich muss ja erst den Rückwert der Funktion erhalten (den Username) und DANN erst mit der for-Schleife weitermachen.
Delphi-Quellcode:
Ich habe mit die Funktionalität mit einem kleinen Trick getestet und zwar, indem ich eine ShowMessage in die for-Schleife gemacht habe. Also funktionieren tut es generell, aber so wie es oben steht, eben nicht.
type
TUserInfo = class(TThread) private procedure GetUserName(UIN : Cardinal); end; [...] procedure TUserInfo.GetUserName(UIN: Cardinal); var test : String; begin Form1.ICQClient1.RequestInfoShort(UIN); end; [...] procedure TForm1.ICQClient1UserInfoShort(Sender: TObject; UIN, NickName, FirstName, LastName, Email: string; UserFound, AuthRequired: Boolean); begin RequestedUsername := NickName; end; //////////////////////////////////////////////////////////////////////// procedure TForm1.Button1Click(Sender: TObject); begin for I := 0 to 10 do begin UserThread.GetUserName(StrToInt(EasyListView.Items.Items[I].Captions[1])); // Hier ist die UIN drin // ShowMessage('Verzögerung'); EasyListView.Items.Items[I].Captions[2] := RequestedUsername; end; end; Wer kann mir helfen? |
Re: Thread, aber wie einbauen?!
was im Thread ausgeführt werden soll muss in die Execute-Methode bzw. von dort her aufgerufen werden. Das was du hast ist einfach nur eine Methode des Threadobjectes welche du aber im Context des Hauptthreads wohl aufrufst. Damit es im Kontext dieses Threads aufgeführt wird muss es eben in die Execute-Methode da diese eben als Thread ausgeführt wird bzw. der Threadeinstiegspunkt ist. Am besten du schaust dir ein paar Tutorials an.
|
Re: Thread, aber wie einbauen?!
@Yheeky: Du scheinst den Sinn von Threads noch nicht verstanden zu haben, denn ein solcher ist das Letzte, das du gerade brauchst ;) . Mit Threads lassen sich synchrone Methoden asynchron aufrufen, du willst aber anscheinend eine asynchrone Methode synchron aufrufen.
Nun, die Lösung liegt eigentlich auf der Hand und kommt auch ganz ohne weitere Klassen aus: Verschiebe die Zuweisung in den OnUserInfoShort-Eventhandler. |
Re: Thread, aber wie einbauen?!
Dass ich das Thema Threads noch nicht richtig verstanden habe, scheint fast so ;)
Ich hatte mal was damit gemacht, damals hatte es funktioniert (war wohl nur Glück *g*). Ich habe eben mal in das Tutorial von Luckie geschaut, aber das ist mir schon zu umfangreich...so tief muss ich für mein Problem garnicht gehen, denke ich. Eine kurze Einleitung zum Thema würde mich glaub ich trotzdem gut tun. @Khabarakh: Ich bin mir nicht sicher, was du meinst. Ich jedenfalls weiss nicht, wie ich das realisieren sollte. Hast du vielleicht ne Idee? Edit: Falls du das meinst:
Delphi-Quellcode:
Hier ist ja gerade mein Problem, dass die for-Schleife zu schnell ist...sie muss auf die Fertigstellung der Prozedur UserInfoShort warten...und ich denke das geht doch mit Threads oder?
procedure TForm1.ICQClient1UserInfoShort(Sender: TObject; UIN, NickName,
FirstName, LastName, Email: string; UserFound, AuthRequired: Boolean); begin EasyListView1.Items.Items[RequestedIndex].Captions[2] := Nickname; end; procedure TForm1.Button1Click(Sender: TObject); var I: Integer; begin for I := 0 to EasyListView1.Items.Count - 1 do begin RequestedIndex := I; ICQClient1.RequestInfoShort(StrToInt(EasyListView1.Items.Items[I].Captions[1])); end; end; |
Re: Thread, aber wie einbauen?!
Moin,
also ich habe mal ne Nacht drüber geschlafen und ich glaube ich weiss nun was du meinst. Beim Runterladen der Serverliste wird in ICQClient1.ContactList schon alles mit heruntergeladen. Somit kann ich mir die Abfrage sparen. Nichtsdestotrotz würde mich die Variante interessieren, die ich hier angesprochen habe...wäre nett, wenn sich jemand kurz die Zeit nehmen würde und das nem Thread-Neuling erklären könnte :) |
Re: Thread, aber wie einbauen?!
Zitat:
Thread := false; asynchrone := true; Es geht hier "nur" um Events... Events werden nicht aufgerufen, sondern "kommen" zurück. Frank :coder: |
Re: Thread, aber wie einbauen?!
Moin,
ich teste die threads mit
Delphi-Quellcode:
da hör ich das sich was tut; :stupid:
windows.Beep(1500,200);
beep müste meineswissens thread sicher sein... :cyclops: |
Re: Thread, aber wie einbauen?!
Achje, da war ja noch eine Schleife *g* . Bei mehreren Abfragen entsteht das Problem, dass du im OnUserInfoShort-Eventhandler ja nicht weißt, welchem TreeView-Node der Nickname nun zugewiesen werden soll, schließlich können die Ergebnisse in einer beliebigen Reihenfolge hereinkommen. Da du aber noch die UIN mitgeliefert bekommst, musst du nur nach dem Node mit dieser ID suchen und kannst ihm dann den Nickname zuweisen.
Wie gesagt, Threads brauchst du hier auf keinen Fall ;) . |
Re: Thread, aber wie einbauen?!
Du meinst:
Delphi-Quellcode:
Wäre natürlich sehr langsam, aber könnte funktionieren...werde ich mal zuhause testen, einfach weils mich interessiert. Die andere Variante müsste aber funktionieren.
procedure TForm1.ICQClient1UserInfoShort(Sender: TObject; UIN, NickName,
FirstName, LastName, Email: string; UserFound, AuthRequired: Boolean); var I: Integer; begin for I := 0 to EasyListView1.Items.Count - 1 do if UIN = EasyListView1.Items.Items[I].Captions[1] then EasyListView1.Items.Items[I].Captions[2] := Nickname; end; procedure TForm1.Button1Click(Sender: TObject); var I: Integer; begin for I := 0 to EasyListView1.Items.Count - 1 do ICQClient1.RequestInfoShort(StrToInt(EasyListView1.Items.Items[I].Captions[1])); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz