AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Thread, aber wie einbauen?!

Ein Thema von Yheeky · begonnen am 18. Jan 2007 · letzter Beitrag vom 19. Jan 2007
Antwort Antwort
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#1

Thread, aber wie einbauen?!

  Alt 18. Jan 2007, 19:43
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:
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;
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.

Wer kann mir helfen?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Thread, aber wie einbauen?!

  Alt 18. Jan 2007, 20:35
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#3

Re: Thread, aber wie einbauen?!

  Alt 18. Jan 2007, 21:04
@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.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#4

Re: Thread, aber wie einbauen?!

  Alt 18. Jan 2007, 21:47
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:
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;
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?
  Mit Zitat antworten Zitat
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#5

Re: Thread, aber wie einbauen?!

  Alt 19. Jan 2007, 06:39
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
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.130 Beiträge
 
Delphi 10.3 Rio
 
#6

Re: Thread, aber wie einbauen?!

  Alt 19. Jan 2007, 07:15
Zitat von Yheeky:
...wäre nett, wenn sich jemand kurz die Zeit nehmen würde und das nem Thread-Neuling erklären könnte
Wie Khabarakh schon geschrieben hat..

Thread := false;
asynchrone := true;

Es geht hier "nur" um Events... Events werden nicht aufgerufen, sondern "kommen" zurück.


Frank
  Mit Zitat antworten Zitat
Benutzerbild von yörsch
yörsch

Registriert seit: 10. Jan 2007
Ort: Lampertheim
206 Beiträge
 
Delphi XE2 Architect
 
#7

Re: Thread, aber wie einbauen?!

  Alt 19. Jan 2007, 07:47
Moin,
ich teste die threads mit
windows.Beep(1500,200); da hör ich das sich was tut;
beep müste meineswissens thread sicher sein...
Jörg
have FUN
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#8

Re: Thread, aber wie einbauen?!

  Alt 19. Jan 2007, 09:50
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 .
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#9

Re: Thread, aber wie einbauen?!

  Alt 19. Jan 2007, 11:31
Du meinst:

Delphi-Quellcode:
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;
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz