AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Beim Programmstart geht es, im Thread nicht?

Beim Programmstart geht es, im Thread nicht?

Ein Thema von Mattze · begonnen am 30. Jan 2011 · letzter Beitrag vom 1. Feb 2011
Antwort Antwort
Seite 1 von 2  1 2   
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#1

Beim Programmstart geht es, im Thread nicht?

  Alt 30. Jan 2011, 10:34
Hallo,

ganz komisches Problem bei dem ich keine Idee habe. Vielleicht könnt Ihr mir helfen:
Ich habe mir eine Laufwerksleiste gebastelt, die eigentlich ganz ausgezeichnet funktioniert.
Die nötigen zusätzlichen Daten (z. Bsp. die Laufwerksiconen) wurden zuerst direkt (seriell im Programmabschnitt) ermittelt. Das ging sowohl beim Programmstart als auch bei Devicechange (Devicearrival) problemlos.
Nun habe ich aber von Microsoft die Empfehlung gelesen, dass man das möglichst per Thread machen sollt, um das Devicechange nicht zu überfrachten.
Also habe ich einen Thread gebastelt.
Der wird auch beim Programmstart für jedes Laufwerk ordentlich aufgerufen und baut alles, auch die richtigen Iconen richtig zusammen.
Aber nicht bei Devicearrival.
Er arbeitet mit (ImageIndex und hint sind vom erweiterten TButton)

ImageListHandle:=SHGetFileInfo(pchar(pidl),0,Finfo ,
sizeof(TSHFILEINFO),
SHGFI_PIDL or SHGFI_SysIconIndex or SHGFI_Icon or SHGFI_Smallicon or
SHGFI_displayname);

ImageIndex:=FInfo.iicon;
hint:=FInfo.szDisplayName;


szDisplayname, Typename funktionieren alle dufte. Nur das Icon kriegt er einfach nicht und wählt da ein Standardicon.

Frage(n):
Warum geht das zwar beim Programmstart richtig, aber nicht in Devicearrival?
Warum geht das beim Programmstart, aber nicht im Thread aus dem Programm?
Warum geht das nur für das Icon nicht, alles andere wird mit der gleichen Funktion im Thread aber ordentlich gesetzt?

Was kann man da tun?

Gruß
Matthias
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.109 Beiträge
 
Delphi 12 Athens
 
#2

AW: Beim Programmstart geht es, im Thread nicht?

  Alt 30. Jan 2011, 10:44
Du greifst von einem Thread direkt auf die VCL zu?
Sowas macht man nicht, denn die VCL ist nicht threadsave!

Delphi-Referenz durchsuchenSynchronize
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#3

AW: Beim Programmstart geht es, im Thread nicht?

  Alt 30. Jan 2011, 12:33
Richtig!
Ich habe es auch mit Synchronize probiert. Keine Änderung!
Und da alle anderen Werte (szDisplayname usw.) ordentlich "in der VCL" ordentlich gesetzt wurden, habe ich es wieder rausgenommen.
Er findet einzig und allein den Iconindex in der Systemimagelist nicht, obwohl vorhanden! Er setzt dann etwas anderes ein. (Genau: Nr. 7, während der richtige 271 hat!)
Beim Programmstart findet er ihn.
Das ist VOR der VCL. Das SHGetFileInfo hat sicher noch nicht allzu viel mit der VCL zu tun.
Warum der Unterschied?

Gruß
Mattze
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.109 Beiträge
 
Delphi 12 Athens
 
#4

AW: Beim Programmstart geht es, im Thread nicht?

  Alt 30. Jan 2011, 12:48
Hmm, nee mit der VCL nicht, aber vor der VCL läuft auch alles noch im Hauptthread ab.

Was passiert, wenn du diese Funktion einfach mal direkt über einen Button aufrufst?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: Beim Programmstart geht es, im Thread nicht?

  Alt 30. Jan 2011, 12:53
Vielleicht ist es nur hier ein Schreibfehler?
ImageIndex:=FInfo.iicon;
Obwohl ja eigentlich Delphi bei Schreibfehler meckert

Ansonsten kann ich @himitsu nur zustimmen. Mal mit nen Button starten und debuggen und die Werte mal auslesen wo der Index geholt wird!

Gruss alfold
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#6

AW: Beim Programmstart geht es, im Thread nicht?

  Alt 30. Jan 2011, 14:12
Hallo,

es ist kein Schreibfehler. In meiner Frage steht Finfo.iicon!

Nochmals: Der Witz und das Komische ist, dass das Icon mit dieser Methode völlig richtig bestimmt wird - nur nicht in Devicearrival.

1. Es war mal direkt (also ohne Thread) im Devicearrival kodiert. Kein Problem! Alles OK!
Dann habe ich das in einen Thread gepackt.

2. Beim Programmstart wird genau das gleiche mittels des Threads aufgerufen. Kein Problem! Alles OK! Das FInfo.iicon ist korrekt bestimmt.

3. Der gleiche Thread wird genau auf die gleiche Art wie beim Programmstart beim Devicearrival in Devicechange aufgerufen. Das Icon wird nicht gefunden. Stattdessen wir ein Standardicon zurückgeliefert. Für mich ist merkwürdig, dass aber FInfo.szDisplayname immer richtig gefunden wird.

Alle Klarheiten beseitigt? Es ist ziemlich schwierig zu beschreiben,
weil da zweimal genau das gleiche zu halb-unterschiedlichen Ergebnissen kommt.

Gruß
Mattze

PS: D7 pro, Windows 7 HP
Ich konnte die Iconnummern angeben, weil ich sie mir mal habe anzeigen lassen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.109 Beiträge
 
Delphi 12 Athens
 
#7

AW: Beim Programmstart geht es, im Thread nicht?

  Alt 30. Jan 2011, 14:44
Es kann sein, daß Windows für jeden Thread eine eigene ImageList erstellt, somit wäre es möglich, daß die Liste im Thread eine andere ist, als die im Hauptthread.

Jedes Programm hat ja auch seine eigene SystemImageList, wobei ich auf diese bisher immer nur im Hauptthread zugriff, also vielleicht doch nicht nur je Programminstanz, sondern direkt für jeden Thread (damit Windows da nichts gegen Threads absichern mußte).

Wenn dem so ist, dann bleiben nur zwei/drei Möglichkeiten:
- das Auslesen in den Hauptthread verlagen
- die Icons im Thread auslesen und in je ein TIcon kopieren
- oder die Icons im Thread auslesen und an eine programmeigene TImageList kopieren
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (30. Jan 2011 um 14:46 Uhr)
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#8

AW: Beim Programmstart geht es, im Thread nicht?

  Alt 30. Jan 2011, 14:52
Hallo,

kleine Ergänzung und Einschränkung:
Ich habe es eben unter XP probiert und nun scheint sich zu zeigen, dass es wirklich nur bei USB-Sticks daneben geht.
Bei neuer DVD in das DVD-LW oder der externen (schon beim Start angeschlossenen) USB-HD kommt auch das richtige Icon.
Beim USB-Stick, wenn er vor dem Programmstart schon angeschlossen ist, auch.
Das richtige Icon wird eben "nur" nicht gefunden, wenn der USB-Stick erst während des Programmlaufs angesteckt wird. Und das unabhängig davon, ob das Icon schon in der Systemimagelist steht oder nicht. (Beim Windows-Explorer funktioniert es aber richtig!)

Nur der Vollständigkeit halber:
Das Icon steht in der Wurzel auf dem Stick und ist dort in die Autorun.inf eingetragen. Ob das ein Geschwindigkeitsproblem ist?
Wie gesagt, wenn ich das nicht über Thread mache, sondern das, was in execute steht, direkt ausführen lasse, funktioniert es!?
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#9

AW: Beim Programmstart geht es, im Thread nicht?

  Alt 30. Jan 2011, 14:58
Hallo,

danke!
Das werde ich mal probieren.
Es wäre aus Sicherheitsgründen des Systems sogar verständlich, dass jeder Thread auch eine eigene "Systemimagelist" hat.
Ich werde das nachher mal probieren.

Aber wie macht das dann der Explorer? Ich dachte eigentlich, dass der sowas auch über einen Thread macht...

Ich melde mich...

Gruß
Mattze
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#10

AW: Beim Programmstart geht es, im Thread nicht?

  Alt 30. Jan 2011, 15:41
Hm...
Mir fällt gerade auf, dass es mit der eigenen Imagelist pro Thread wahrscheinlich nicht sein kann.
Wie gesagt:
Ist der USB-Stick beim Programmstart dran, ist auch das richtige Icon da, obwohl das genau über diesen Thread eingebaut wird!
Wenn der USB-Stick mal dran war, steht dessen Icon auch schon in der Systemimagelist. Angezeigt wird es aber nicht, wenn der Stick dann nach Programmstart nochmal eingesteckt wird. Also auch das Kopieren der Systemimagelist in eine Threadimagelist kann es nicht sein.

Also, ich sehe da nicht durch! Irgendwas fehlt mir da. Der Explorer kann es doch auch und der macht es sicherlich auch per Thread...

Gruß
Mattze
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 13:43 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