![]() |
AW: Form in neuem Thread laufen lassen
Zitat:
Danke fürs Angebot, Interesse ja, aber ich weiss nicht, ob es nicht für mich zu steil ist, da mit zu arbeiten. :oops: lg, jus |
AW: Form in neuem Thread laufen lassen
Zitat:
|
AW: Form in neuem Thread laufen lassen
Was ich bisher in Luckie Tutorial gelesen habe, sollte das ganze mehr oder weniger problemlos aus dem Tutorial abzuleiten sein. Das ganze könnte man sicherlich gut in eine/mehrere Klassen verpacken und eben wie schon Jaenicke sagt einen schicken Wrapper erstellen, so dass man sich damit dann leicht hier und da ein nonVCL-Dialog ganz nach den verschiedenen Ansprüchen erstellen kann.
Sicherlich hat jeder hier, der Interesse bekundet, etwas andere Anforderungen. Natürlich ist es nicht ganz so mal eben gemacht, aber ein interessantes Thema. Wenn Jaenicke seinen Wrapper zur Verfügung stellt, dann müsste jeder auch erst mal schauen, in wie weit er damit klar kommt, bzw. ob die darin enthaltenen Möglichkeiten für sein Vorhaben bereits ausreicht. Ich muss mir Luckie's Tutorial mal ausdrucken (kann besser Papier lesen, als am Bildschirm). Und dann fange ich einfach mal an. Ein Fenster mit 2 Buttons hat schon mal ganz gut geklappt. Leider hatte ich in den letzten Tage nicht die Zeit, mich damit weiter ausgiebig zu beschäftigen. Werde ich aber zeitnah nachholen. |
AW: Form in neuem Thread laufen lassen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
naja, dann zeige ich mal, was ich bisher habe, viel ist es nicht und ich weiss nicht einmal, ob es überhaupt so richtig ist. Das Projekt besteht aus 2 Units. Habe das gesamte Projekt auch Zip Anhang angehängt. Habe probeweise auf die Hauptunit folgende Unit1.pas ein Button, Memo und Progressbar draufgeklatscht.
Delphi-Quellcode:
In der folgenden Unit2.pas ist der Thread drin:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,unit2, ComCtrls; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; ProgressBar1: TProgressBar; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; DataThread: TDataThread; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i,j: Integer; begin for I := 0 to 100000 do begin for j := 0 to 100 do progressBar1.Position:=j; end; end; procedure TForm1.FormCreate(Sender: TObject); begin DataThread := tDataThread.Create(''); end; end.
Delphi-Quellcode:
Das Formular im Thread enhält ein Button und eine Listbox wie folgt in main.rc definiert.
unit Unit2;
interface uses classes, windows, Messages; type TDataThread = class(TThread) private hdlg: DWORD ; protected procedure Execute; override; public constructor Create(const Title:String); reintroduce; end; function dlgfunc(hwnd: hwnd; umsg: dword; wparam: wparam; lparam: lparam): bool; stdcall; implementation {$R main.res} //hier kommt die Vorlage rein function dlgfunc(hwnd: hwnd; umsg: dword; wparam: wparam; lparam: lparam): bool; stdcall; begin result := true; case umsg of WM_CLOSE: EndDialog(hWnd, 0); WM_DESTROY: PostQuitMessage(0); WM_COMMAND: if hiword(wparam) = BN_CLICKED then begin case loword(wparam) of IDOK: begin messagebox(hwnd, 'OK Button gedrückt', 'Meldung', 0); sendmessage(hwnd, WM_CLOSE, 0, 0); // PostQuitMessage(0); end; end; end; else result := false; end; end; constructor TDataThread.Create(const Title: String); begin inherited Create(False); hdlg := CreateDialog(HInstance, MAKEINTRESOURCE(100), Self.Handle, @DlgFunc); ShowWindow(hdlg, SW_SHOW); end; procedure TDataThread.Execute; var Msg: TMsg; begin while not terminated do begin if GetMessage(msg,0,0,0) then begin if not(IsDialogMessage(hdlg, Msg)) then begin TranslateMessage(Msg); DispatchMessage(Msg); end; end; end; end; end.
Code:
Der TDataThread ladet einfach per Windows API "CreateDialog" das Threaddialogfenster rein und mit "ShowWindow" wird es angezeigt. Wie man in Unit2.pas sieht, habe ich brutal im Thread eine Nachrichtenschleifen eingebaut. Das Threaddialogfenster reagiert sogar, wenn man auf den Button drückt. Ich muß zugeben, dass ich aber nicht weiß, ob es so überhaupt richtig ist, oder komplett auf dem Holzweg bin. Außerdem habe ich festgestellt, dass wenn ich in Unit1.pas auf Button1 klicke, womit der Hauptthread auf meinem Rechner kurzfristig überlastet wird, das Threaddialogfenster in dieser Zeit auch nicht mehr reagiert. Normalerweise sollte doch das Threaddialogfenster unabhängig vom Hauptfenster sein? :gruebel:
#define IDC_LIST 1002
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL 100 DIALOGEX 6, 18, 264, 200 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_TOOLWINDOW CAPTION "Fenster-Caption" FONT 8, "Arial" BEGIN PUSHBUTTON "OK", IDOK, 61, 65, 140, 14 LISTBOX IDC_LIST,7,25,138,106,LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP END Bitte um Unterstützung. :oops: lg, jus |
AW: Form in neuem Thread laufen lassen
Erzeuge alles im execute, das create ist noch im hauptthread, du musst das Window in dem Tread erzeugen in dem es benutzt werden soll.
|
AW: Form in neuem Thread laufen lassen
Außerdem wäre mein Anspruch, die Forms nicht über Resourcen zu definieren. Damit wäre es dynamischer einsetzbar.
|
AW: Form in neuem Thread laufen lassen
Hallo HobbyCoder
hier findest du u.a. auch ein Beispiel "Fenster ohne VCL via sep. Thread steuern": ![]() Du siehst auf dieser Seite auch, wie du Buttons und Co - wie du es gern hättest - zur Laufzeit generierst. (Ich hatte dir den Link via PM gesendet, du hast ihn wohl übersehen :-D.) |
AW: Form in neuem Thread laufen lassen
Danke Michael. Hatte ich auch schon gesehen.
Ich werde das auch erst mal so stumpf umsetzen, damit ich die Anforderungen, die ich in meiner Anwendung habe, erst einmal am Laufen habe. Da ich aber denke, dass ich sowas öfter mal gebrauchen könnte, werde ich mir daraus mal was basteln, was dann leicht wieder verwendbar ist. Wenn das soweit ist, dann werde ich das hier mal posten. Wird aber noch etwas dauern, weil ich leider nicht meine komplette Zeit dafür zur Verfügung stellen kann. |
AW: Form in neuem Thread laufen lassen
Hey :)
Da mich dieses Thema auch schon lange interessiert hat; man könnte sich bei solchen Wrapperklassen auch noch einen weiteren Vorteil sichern: Das Verwenden mehrerer Threads. Das Argument "Synchronisierung" kann man damit tatsächlich auch erschlagen. Windows bietet von Haus aus schon eine Messagequeue für die Nachrichtenbehandlung der Fensterereignisse an (klar, muss ja intern auch irgendwie funktionieren). Das MSDN schreibt dazu: ![]() Zitat:
![]()
Delphi-Quellcode:
vor. Man registriert eine Callback Funktion auf einen
WndProc
Delphi-Quellcode:
-Code, sodass man dann einfach jedes Mal, wenn man der GUI etwas mitteilen möchte, einfach
Msg
Delphi-Quellcode:
aufruft (oder wenn man das an ein
PostThreadMessage
Delphi-Quellcode:
binden möchte, eben
hwnd
![]()
Delphi-Quellcode:
/
SendMessage
![]()
Delphi-Quellcode:
) und die Synchronisierung einfach über Windowsboardmittel durchführt. Wisst ihr was ich meine? Macht das für euch auch Sinn? Ich denke, dass man so zum Beispiel ein Log in einem Memo führen könnte, da die Messages ja immer hübsch einzeln "reinblubbern" - und das egal wie viele Threads im Hintergrund beteiligt sind.
PostMessage
Brighty P.S. Habe gerade interessehalber ![]() |
AW: Form in neuem Thread laufen lassen
Zitat:
Delphi-Quellcode:
heraus Daten an das Hauptformular zu schicken ohne
TThread.Execute
Delphi-Quellcode:
zu verwenden.
Synchronize
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:30 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