AGB  ·  Datenschutz  ·  Impressum  







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

Mal wieder Threads....

Ein Thema von DelTurbo · begonnen am 29. Jan 2010 · letzter Beitrag vom 3. Feb 2010
Antwort Antwort
Seite 1 von 3  1 23      
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.193 Beiträge
 
Delphi 2007 Architect
 
#1

Mal wieder Threads....

  Alt 29. Jan 2010, 12:24
Hi,

ich suche seit heute morgen ein vernünftiges beispiel wie man "sauber" threads erstellt. Und zwar läuft es bei folgendermasen ab....

Ich habe eine sub. Die kennt ein Array z.b. so..
Delphi-Quellcode:
type
  TMyThread = record
   InUse :Boolean;
   FormHandle :THandle;
   Text :String;
   ..... usw.
end;
var
   MyThread :Array[0..20] of TMyThread;
Beim start des programms setze ich alle InUse auf false. Wenn ich einen Thread starten möchte, durchsuche ich MyThread ob ein InUse=False ist. Wenn ja dann setze ich es sofort auf True und übergebe den Index an meinen Thread.

Der Thread hohlt sich dann die nummer und hat damit ja zugriff auf den Text der ihm gehört. Beim beenden des Threads, also als letzte zeile setzte ich MyThread[Index].InUse:=False; damit er wieder frei ist.

Das hier ist ja nur ein beispiel. Es wird natürlich wesentlich mehr in dem Thread gemacht. Aber das ist ja erstmal egal für ein kleines beispiel.

Delphi-Quellcode:
function GeloesterThread(varptr: Pointer): LongInt; stdcall;
var
  i :Integer;
begin
  i:=integer(varptr^);
  //in i steht dann der index
  MyThread[i].InUse:=False;
end;
So starte ich den

Delphi-Quellcode:
ThreadHandle:=CreateThread(nil, 0, TFNThreadStartRoutine(@GeloesterThread),@index, 0, id);
if ThreadHandle<>0 then CloseHandle(ThreadHandle);
Es klappt auch soweit. Aber es scheppert doch relativ oft. Und ich kann leider nicht nachvollziehen wie, wo und warum.

Nun habe ich gelesen man muss das mit TThread / BeginThread machen. Aber ich finde kein einfaches beispiel was auf meine sache zutrifft.

Wär super wenn mir einer helfen könnte. Ich komme einfach nichtmehr weiter. Es ist auch sehr sehr frustrierend wenn man stundenlang sucht und nix "richtiges" findet. Am geilsten wäre natürlich ein "richtiges" beispiel.

Vielen dank im voraus
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Mal wieder Threads....

  Alt 29. Jan 2010, 12:31
Was machst du denn im Thread? Und die Forensuche nach Delphi-Referenz durchsuchenBeginThread hat keine brauchbaren Ergebnisse gebracht? Eventuell hilft auch die Suche nach Delphi-Referenz durchsuchenThread pool.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.193 Beiträge
 
Delphi 2007 Architect
 
#3

Re: Mal wieder Threads....

  Alt 29. Jan 2010, 12:42
Nein, die beispiele die ich gefunden habe hängen immer an dieser Form1. Aber ich habe das als komplett eigene unit gemacht.

Beispiel von gestern abend. Es liefen 16 Threads. Der nächste der kam meinte er wäre thread 38?!?

Ich denke mal das mit dem Thread ablösen habe ich nicht verstanden. Ich weiss zwar was ich proggen möchte, aber wenn einem die syntax fehlt kommt man nicht weiter.

Deswegen auch die bitte nach einem Beispiel.

Gruss
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#4

Re: Mal wieder Threads....

  Alt 29. Jan 2010, 12:43
Hallo DelTurbo, such nicht nach einem Thread der nichts tut, sondern lass dass den Threads selber machen.
Schreib alles was abzuarbeiten ist in einen Buffer (Ringbuffer), triggere ein Event und die Threads wachen auf, und bearbeiten
die Daten usw. und so fort.
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Mal wieder Threads....

  Alt 29. Jan 2010, 13:00
Zitat von DelTurbo:
Delphi-Quellcode:
ThreadHandle:=CreateThread(nil, 0, TFNThreadStartRoutine(@GeloesterThread),@index, 0, id);
if ThreadHandle<>0 then CloseHandle(ThreadHandle);
Nun habe ich gelesen man muss das mit TThread / BeginThread machen. Aber ich finde kein einfaches beispiel was auf meine sache zutrifft.
Es gibt drei Möglichkeiten, einen Thread zu starten.
Du benutzt direkt die WinAPI-Funktionen.
Und da brauchst du auch kein System.BeginThread. Das gehört nämlich zur zweiten Möglichkeit.
Die Nutzung von TThread ist die dritte Möglichkeit und kommt aus der RTL.

Diese drei Wege solltest du trennen, wenn du CreateThread benutzt, brauchst du weder BeginThread noch TThread.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Mal wieder Threads....

  Alt 29. Jan 2010, 13:18
Nie CreateThread benutzen (zumindest bis D2006)! Nimm BeginThread!
BeginThread macht auch nix weiter als CreateThread aufzurufen und den Speichermanager darüber zu informieren, dass er jetzt bei der Speicherreservierung mit CriticalSections arbeiten muss. Und der zweite Teil ist extrem wichtig.
(Zudem muss deine ThreadProc jetzt nicht stdcall sein, sondern der Standard register reicht)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.193 Beiträge
 
Delphi 2007 Architect
 
#7

Re: Mal wieder Threads....

  Alt 29. Jan 2010, 13:30
Ui, ich hatte mal BeginThread genommen. Aber das ging nicht. Ich hatte das stdcall nicht weggemacht. Nun wo es weg ist läuft es.

Wie stabil es läuft kann ich leider nicht sofort sagen. Da muss ich abwarten.

Vielen vielen dank, ich hoffe das rennt nun stabiler.
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.193 Beiträge
 
Delphi 2007 Architect
 
#8

Re: Mal wieder Threads....

  Alt 29. Jan 2010, 13:52
Muss ich da auf nochwas achten? Oder wirklich nur Create gegen Begin tauschen und das stdcall rausnehmen?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Mal wieder Threads....

  Alt 29. Jan 2010, 14:12
Zu dem Unterschied CreateThread und Beginthread ist das alles.

Zu deiner Vorgehensweise hat ja Astat schon was gesagt (bzw. wie man es besser machen sollte). Wenn du es so beibehälst, kann ich dir zumindest sagen, dass an der Übergabe des Index etwas falsch ist. Du übergibst einen Pointer auf eine (möglicherweise sogar lokale) Variable, welche womöglich beim Start des threads gar nicht mehr existiert. Übergib doch den index direkt (kannst ja in der ThreadProc einfach pointer durch integer ersetzen), oder übergib gleich einen Pointer auf deinen Record (der ja anscheinend die Lebenszeit eines Threads überdauert)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.193 Beiträge
 
Delphi 2007 Architect
 
#10

Re: Mal wieder Threads....

  Alt 29. Jan 2010, 14:34
Ich hätte auch viel viel lieber den Index-Wert übergeben. Aber in dem beispiel was ich gefunden hatte war es halt so.

Wie gesagt, mit der Syntax hackt es bei noch.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 21:56 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