Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Frage zu Treads (https://www.delphipraxis.net/13968-frage-zu-treads.html)

silentAMD 29. Dez 2003 23:13


Frage zu Treads
 
Hallo leute,
ich hab ein problem mit meinem filemanager: :evil:
immer wenn eine datei, die ich per shellexecute öffne, ziemlich groß ist, reagiert mein programm nicht mehr, bis diese nach langer zeit geöffnet ist. da ist mir das TThread in den sinn gekommen, aber ich neige etwas ab, dieses zu benutzen, da große fehler dabei entstehen können (steht in nem delphi buch). :warn:

ist es sinnvoll (oder bringt es überhaupt etwas) einen shellexecute-befehl in einem eigenen tread zu öffnen? wenn ja, hat jemand ein beispiel? :coder:


PLEASE HELP!!!!
danke im vorraus.

SleepyMaster 29. Dez 2003 23:16

Re: Frage zu Treads
 
Delphi-Quellcode:
procedure run;
begin
Shellexecute...........
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ThreadID: DWORD;
  ThreadHandle: THandle;
begin
ThreadHandle:=CreateThread(nil, 0, TFNThreadStartRoutine(@Run),
    nil, 0, ThreadID);
  if ThreadHandle<>0 then CloseHandle(ThreadHandle);
end;
[EDIT=SleepyMaster]Hatte Tags vergessen[/EDIT]

silentAMD 29. Dez 2003 23:21

Re: Frage zu Treads
 
DANKE!!! :hello: :thuimb:

bringt das auch dann den erhofften vorteil? :|

SleepyMaster 29. Dez 2003 23:23

Re: Frage zu Treads
 
Keine Ahnung! ;)

Aber teste es doch einfach mal!

Luckie 30. Dez 2003 13:27

Re: Frage zu Treads
 
Aua, das tut weh. Und wenn ich das sehe, dann stimmt es auch, was in dem Buch drinsteht, das Threads gefährlich sind. Aber das gilt nur, wenn man nicht weiß, was man macht.

CreateThread soollte man nicht benutzen, da
Zitat:

Zitat von Mein Tutorial
In einem Delphi-Programm sollten sie nie die Funktion CreateThread direkt aufrufen. Benutzen sie stattdessen die
Funktion BeginThread. Grund: BeginThread kapselt zwar nur die API-Funktion CreateThread, setzt aber zusätzlich
noch die globale Variable IsMultiThread und macht somit den Heap thread-sicher.

Dann die Thread-Funktion: Das ist eine Funktion! keine Prozedur.
Delphi-Quellcode:
function Thread(p: Pointer): Integer;
So hat sie auszusehen und nicht anders.

Aber bevor ich hier großartig alles noch mal tippe, hier der Link zu meinem Tutorial: http://www.luckie-online.de/tutorials/threads/

SleepyMaster 30. Dez 2003 13:34

Re: Frage zu Treads
 
Solang es läuft mach ich mir keine Gedanken, was an meinem Quellcode falsch ist!

Aber jetzt wo du mich schon extra draufhingewiesen hast nehme ich BeginThread anstelle von CreateThread (Auch wenn ich keinen Unterschied sehe).

Und ob die function jetzt so aussieht:
Delphi-Quellcode:
function Thread(p: Pointer): Integer;
Oder ne procedure ist und so aussieht:
Delphi-Quellcode:
procedure Thread;
Hat bei mir noch NIE einen Unterschied gemacht!

Chewie 30. Dez 2003 13:37

Re: Frage zu Treads
 
Zitat:

Zitat von Luckie
Dann die Thread-Funktion: Das ist eine Funktion! keine Prozedur.
Delphi-Quellcode:
function Thread(p: Pointer): Integer;
So hat sie auszusehen und nicht anders.

Eigentlich empfielt Microsoft folgenden Aufbau:
Delphi-Quellcode:
function Thread(p: Pointer): DWord;
Aber ob Prozedur oder Funktion ist ziemlich wurscht, wenn man weiß, dass man die Rückgabe nicht benötigt. Wenn ich sowieso immer 0 zurückgeben würde, kann ich auch eine Prozedur nehmen.
Aber i.A. schaden Fehlercodes nicht :wink:

Luckie 30. Dez 2003 13:46

Re: Frage zu Treads
 
Zitat:

Zitat von SleepyMaster
Solang es läuft mach ich mir keine Gedanken, was an meinem Quellcode falsch ist!

Nun ja. Und dann Schimpfen alle immer auf Microsoft, wenn Windows mal wieder abstürzt. Und keiner denkt daran, dass es eventuell gar nicht das OS war.

Zitat:

(Auch wenn ich keinen Unterschied sehe).
BeginThread setzt die globale Variable IsMultiThread auf True und macht so Zugriffe auf den Heap so threadsafe

Zitat:

Und ob die function jetzt so aussieht:
Delphi-Quellcode:
function Thread(p: Pointer): Integer;
Oder ne procedure ist und so aussieht:
Delphi-Quellcode:
procedure Thread;

Na dann versuch mal Parameter an den Thread zu übergeben.

Zitat:

Hat bei mir noch NIE einen Unterschied gemacht!
Ja, bis es zum erstenmal kracht.

SleepyMaster 30. Dez 2003 13:58

Re: Frage zu Treads
 
Delphi-Quellcode:
Nun ja. Und dann Schimpfen alle immer auf Microsoft, wenn Windows mal wieder abstürzt. Und keiner denkt daran, dass es eventuell gar nicht das OS war.
Mein XP!!! ist sau stabil

Zitat:

BeginThread setzt die globale Variable IsMultiThread auf True und macht so Zugriffe auf den Heap so threadsafe
Aja!?!

Zitat:

Na dann versuch mal Parameter an den Thread zu übergeben.
Ich wollte bis jetzt mal noch keinem Thread einen Parameter übergeben!

Zitat:

Ja, bis es zum erstenmal kracht.
Genau! Aber vorher muss ich mir auch keine Gedanken drüber machen!

Zitat:

Solang es läuft mach ich mir keine Gedanken, was an meinem Quellcode falsch ist!
und ich finde, dass sich andere solange auch keine Gedanke über meine (nicht vorhandenen) Probleme machen söllten!

mirage228 30. Dez 2003 14:07

Re: Frage zu Treads
 
Hi SleepyMaster,

da will dir Luckie klar machen, wieso man es so machen sollte, und du beginnst sofort ihn zu attackieren.

Es hat auch _niemand_ von deinem Computer geredet, sondern auf dem Computer, wo deine Programm laufen sollen. Ich wäre auch wirklich sehr dankbar, wenn ein Programm aufgrund schlechter Programmierung meinen PC abstürzen lässt...

Du gehst immer von dir aus, und was ist mit anderen Leuten?

Luckie wird seine Aussage nicht ohne Grund gemacht haben, du solltest auf ihn hören.

so far
mirage228

SleepyMaster 30. Dez 2003 14:20

Re: Frage zu Treads
 
Zitat:

da will dir Luckie klar machen, wieso man es so machen sollte, und du beginnst sofort ihn zu attackieren.
An welcher Stelle wollte ich ihn angreifen??? Ich hatte eigendlich garnicht die Absicht!

Zitat:

Du gehst immer von dir aus, und was ist mit anderen Leuten?
Mit dem meinem wollte ich nur sagen, dass mir es egal ist wenn ich einen "Fehler" in meinem Programm habe der keine Auswirkungen hab (Es kann gut sein das es anderen Leuten anders geht, daswegen hatte ich aber extra schon das meinem "betont")

Zitat:

Luckie wird seine Aussage nicht ohne Grund gemacht haben, du solltest auf ihn hören.
Tu ich ja! Ich wollte nur den sinn verstehen!
Zitat:

Aber jetzt wo du mich schon extra draufhingewiesen hast nehme ich BeginThread anstelle von CreateThread (Auch wenn ich keinen Unterschied sehe).

mirage228 30. Dez 2003 14:23

Re: Frage zu Treads
 
Zitat:

Zitat von SleepyMaster
Zitat:

da will dir Luckie klar machen, wieso man es so machen sollte, und du beginnst sofort ihn zu attackieren.
An welcher Stelle wollte ich ihn angreifen??? Ich hatte eigendlich garnicht die Absicht!

[/quote]

Naja, bei mir erweckte es denn anschein... aber wenn du es nicht wolltest, ist ja alles in Ordnung ;-)

mfG
mirage228

silentAMD 2. Jan 2004 16:30

Re: Frage zu Treads
 
kann man eigentlich komponenten in threads umschreiben?
ich hätte nämlich so eine komponente wie die "DRAG AND DROP COMPONENT SUITE 3.7" von torry.net als thread, sodass wenn ich eine datei in den explorer ziehe, der anschließende befehl nichts mehr mit meiner anwendung zu tun hat, denn wenn ich das kontextmenü (Hierher kopieren, Abbrechen...) und während dem kopieren ich auf meiner anwendung normal weitermachen kann, ohne dass der cursor ein kopieren-cursor ist und meine anwendung "disabled" ist, bis der kopiervorgang abgeschlossen ist. :roteyes:

ist sowas möglich bzw. hat jemand so ne komponente? :?:


PLEASE HELP!!!!


und nachträglich allen ein frohes neues jahr!!
:bounce1: :bouncing4: :bounce2: :cheers: :party:

Luckie 2. Jan 2004 16:42

Re: Frage zu Treads
 
Zitat:

Zitat von SleepyMaster
Delphi-Quellcode:
Nun ja. Und dann Schimpfen alle immer auf Microsoft, wenn Windows mal wieder abstürzt. Und keiner denkt daran, dass es eventuell gar nicht das OS war.
Mein XP!!! ist sau stabil

Ohne Fremdprogramme ist wohl so jedes OS stabil. Stellt sich nur die Frage, wie lange das so bleibt bei so grob fahrlässig programmierten Anwendungen. :roll:

Zitat:

Zitat:

BeginThread setzt die globale Variable IsMultiThread auf True und macht so Zugriffe auf den Heap so threadsafe
Aja!?!
Tut sie. Wo ist das Problem?

Zitat:

Zitat:

Na dann versuch mal Parameter an den Thread zu übergeben.
Ich wollte bis jetzt mal noch keinem Thread einen Parameter übergeben!
Dann solltest du es gleioch richtig machen, dann hast du später keine Problem damit.

Zitat:

Zitat:

Ja, bis es zum erstenmal kracht.
Genau! Aber vorher muss ich mir auch keine Gedanken drüber machen!
Falsch. Du musst dir vorher Gedanken machen, denn wenn es bei mir wegen deinem Programm kracht, ist es zu spät.

Zitat:

Zitat:

Solang es läuft mach ich mir keine Gedanken, was an meinem Quellcode falsch ist!
und ich finde, dass sich andere solange auch keine Gedanke über meine (nicht vorhandenen) Probleme machen söllten!
Es zwingt dich niemand meine gut gemeinten Ratschläge, die aus Wissen und Erfahrung resultieren, anzunehmen. Dannbeschwer dich aber auch nachher nicht, wenn es nicht klappt so wie du willst oder stell hier Fragen, warum dein Source so nicht funktioniert oder Schwierigkeiten macht. Und glaub mir, ich habe mich mit Threads beschäftig, oft angewendet und weiß, was ich da gemacht habe, was man bei dir, so habe ich das Gefühl, nicht so recht behaupten kann. :roll:

silentAMD 2. Jan 2004 16:51

Re: Frage zu Treads
 
schade, ich hab mit ner antwort auf meine frage gerechnet... :? :hi:

Luckie 2. Jan 2004 16:55

Re: Frage zu Treads
 
Ich würde meine gut gemeinten Hinweise nicht mit dem Wort "schade" abtun. :?

SleepyMaster 2. Jan 2004 17:28

Re: Frage zu Treads
 
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ShellAPI, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure run;
begin
  ShellExecute(Application.Handle,'open',PChar(Paramstr(0)),nil,nil,SW_SHOWNORMAL);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ThreadID: DWORD;
  ThreadHandle: THandle;
begin
ThreadHandle:=CreateThread(nil, 0, TFNThreadStartRoutine(@Run),
    nil, 0, ThreadID);
  if ThreadHandle<>0 then CloseHandle(ThreadHandle);
end;

end.
Das Prog läuft! Der Rest ist mir egal!

Luckie 2. Jan 2004 17:31

Re: Frage zu Treads
 
Zitat:

Zitat von SleepyMaster
Das Prog läuft! Der Rest ist mir egal!

Mit der Einstellung wirst du es nie weitbringen. Dein Code ist eine tickende Zeitbombe und das sollte dir aus Rücksicht auf die, die dein Programm benutzen nicht egal sein. Aber OK, sag mir bitte nur bescheid, wenn du ein Programm veröffentlichst, damit es nicht versehentlich auf meinem Rechner landet. :roll:

Nachtrag:
Jetz5t woich so manchen Source von so manchen Programm gesehen habe, was man sich auf diversen Freeware Portalen runterladen kann, läuft es mir manchmal kalt den Rücken runter, wenn ich daran denke, dass ich früher mal bedenkenlos solche Programme genutzt habe. *schüttel*

silentAMD 2. Jan 2004 19:36

Re: Frage zu Treads
 
Zitat:

Ich würde meine gut gemeinten Hinweise nicht mit dem Wort "schade" abtun.

naja,
das hin und her mit den threads wollte nicht enden! luckie hat es ja prima erklärt und wenn er schon ein tutorial für threads macht und seine aussage nur ein kapitel eines buches bekräftigt, bin ich schon auf seiner seite. doch nach mindestens 4 posts gegeneinander reichts doch einmal :wink: und meine frage blieb nebensache. :(

Rumpi 2. Jan 2004 21:00

Re: Frage zu Treads
 
Hallo alle zusammen,

ich kann Lukie verstehen, aber was soll man machen,
wer sich nicht helfen lasssen will dem wird gehilft, nur wann?

Ich verwende Thread's mehr als zur Genüge in meinen Prog's und habe meine
Erfahrungen damit gemacht und währe froh gewesen wenn man mir geholfen hätte.

Mach weiter so Luckie, aber begib dich bitte nicht auf eine andere Ebene ...
das hin und her bringt doch keinem was!

Auf ein Neues ...
Rumpi

Chewie 2. Jan 2004 21:37

Re: Frage zu Treads
 
Zitat:

Zitat von Luckie
Zitat:

Zitat:

BeginThread setzt die globale Variable IsMultiThread auf True und macht so Zugriffe auf den Heap so threadsafe
Aja!?!
Tut sie. Wo ist das Problem?

Ich denke, das Problem liegt darin, dass SleepyMaster wohl nicht weiß, was das bedeutet, also was genau im Heap liegt und was threadsicher bedeutet. Ich im übrigen auch nicht... :wink:

Luckie 2. Jan 2004 22:26

Re: Frage zu Treads
 
Der Heap ist ein Speicherbereich im Adressraum des Prozesses, wie der Stack auch, nur dass er etwas anders organisiert ist. Wenn ich jetzt eine multithread Anwendung habe und ein Thread schreibt etwas in den Heap und ein anderer Thread liest gerade zufälligerweise an der gleichen Adresse, kann es passieren, dass der lesende Thread die Daten in einem inkonsistenten Zustand vor findet. Threadsafe bedeutet hier, dass jegliche Zugriffe auf den Heap atomare Operationen sind. Das heißt, wenn ein Thread auf den Heap zugreift, ist er für andere gesperrt. Deswe3gen sollte man sehr vorsichtig sein, wenn man Threads nicht einfach enden läßt sondern sie abschießt. Schießt man einen Thread ab während er auf den Heap zugreift, kann es passieren, dass Heap für die anderen Threads gesperrt bleibt und sie so bis in alle Ewigkeit darauf warten auf ihn zugreifen zu dürfen. Deswegen ist er sehr wichtig, dass man Threads versteht und weiß, was man macht, wenn man sie anwendet. Mit Threads kann man Probleme sehr elegant lösen, macht man aber was falsch oder arbeitet nicht sorgfälltig kann man mit ihnen mehr Probleme bekomen, als man löst. Ein einfaches Application.Processmessage in einer Schleife wäre dann angebrachter für einen Anfänger.

Chewie 3. Jan 2004 09:07

Re: Frage zu Treads
 
Welche Daten sind denn im Heap abgelegt?

Luckie 3. Jan 2004 10:22

Re: Frage zu Treads
 
Globale Variablen zum Beispiel.

Meflin 3. Jan 2004 10:32

Re: Frage zu Treads
 
häng ich meine frage einfach mal hier mit dran:
würde es eine zugriffsverletzung erzeugen, wenn ich aus zwei threads gleichzeitig
auf eine listbox, aber auf unterschiedliche items zugreife?
und:
werden, wennn sich ein thread in einer critical section befindet, alle threads blockiert
(wies in martin strohals tut steht) oder nur die, die in die critical section wollen?

*MFG*

Luckie 3. Jan 2004 16:57

Re: Frage zu Treads
 
Zitat:

Zitat von Meflin
häng ich meine frage einfach mal hier mit dran:
würde es eine zugriffsverletzung erzeugen, wenn ich aus zwei threads gleichzeitig
auf eine listbox, aber auf unterschiedliche items zugreife?

Eien AV wird es nicht geben, nur wenn der erste ein Item lköscht, liest der zweite eventuell ein falsches aus, weil andere anderen nachrücken.
Zitat:

werden, wennn sich ein thread in einer critical section befindet, alle threads blockiert
(wies in martin strohals tut steht) oder nur die, die in die critical section wollen?
Nur die die in die gleiche CS rein wollen logischerweise. Aber tu dir doch mal mein Tutorila dazu an, ist etwas ausführlicher als das von Martin Strohal.

Meflin 3. Jan 2004 17:25

Re: Frage zu Treads
 
thx

Dark Templar 25. Aug 2004 14:12

Re: Frage zu Treads
 
Kann man CS's eigentlich auch vom Hauptprogramm auch in Anspruch nehmen lassen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:39 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