Vorwort:
Dies ist nur ein Testprogramm, in welchem man zur Laufzeit mehrere Threads erstellen kann. Diese Threads unterhalten sich dann mittels
TCP/
IP. Ich wollte das nur einmal ausprobieren. Das Problem befindet sich in keinem Projekt was jetzt irgendwie gelöst werden muss. Deswegen will ich das Problem auch nicht umgehen, sondern einfach nur wissen: Warum bzw. wo hängts?
Problem:
Damit die Threads sich nicht sinnlos unterhalten gibt es zu jedem Thread eine kleine Eingabemaske über ein Formular (ein paar Buttons, 2 Edits, 1 Label, 1 Memo und 1 Shape).
Das sieht dann in der ExecuteMethode so aus (Das Formular wird also direkt im Thread erstellt):
Delphi-Quellcode:
begin
handle:=allocatehwnd(wndproc);
//Windowhandle um Messages aus dem Socket und von der Clientform zu sammeln
Clientform:=TClientform.Create(
nil);
Clientform.owner:=
handle;
//damit die clientform mir auch sagen kann, was sie grad macht
Clientform.Caption:=clientform.Caption+'
#'+inttostr(nummer);
aktshape;
//füllt das Shape auf dem Formular clientform mit rot
Clientform.Show;
ClientSocket:=0;
//winsock.TSocket
run;
//beinhaltet ausschließlich die Messageschleife (getmessage + translatemessage + dispatchmessage) incl. der Abfrage nach terminated
clientform.Close;
clientform.Free;
deallocatehwnd(
handle);
end;
Die Clientform habe ich über die
IDE und mit dem
OI usw. usf. erstellt. Also ganz normal über "Neues Formular" und die Komponenten schön da drauf platziert.
Das Formular unterhält sich auch
nur mit dem Thread. (Und unter den Projekt-Optionen wird es natürlich als nicht "automatsich erzeugen" eingestellt) Es hat also mit dem MainThread nix zu tun.
Auftrentender "Fehler":
Das Programm funktioniert hervorragend, also alles was ich testen wollte klappt. Aber: Die Komponenten auf dem Formular, die ich so schön platziert habe, sind alle ca. 1,5 mal so groß und wurden auch entsprechend verschoben. Also alle Größen (left,top,widht,height) sind etwa um den Faktor 1,5 größer. Da interessiert mich nur das Warum? Ich weis ja, dass
VCL-Komponenten und Threads sich beißen. Aber dass die das so machen?
Es kommt kein Fehler und keine
Exception. InternalReadComponentRes tut doch nur kurz in den Ressourcen lesen und baut dafür eigens einen Stream auf. Da dürfte doch nix passieren.
Vielleicht liegts auch an meinem Delphi. Hab die Formulare aber schonmal testweise komplett neu gemacht. Und wenn ich das Formular im MainThread initialisiere, sieht auch alles richtig aus.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.