Nach Hause
Top.Mail.Ru Yandeks.Metrika
Forum: "Anfänger";
Aktuelles Archiv: 2017.12.24;
Herunterladen: [xml.tar.bz2];

Nach unten

Gewinde Finden Sie ähnliche Zweige


testeruser   (2016-01-14 14:06) [0]

Bitte sagen Sie mir, dass ich später bei der Erstellung die Option FreeOnTerminate gesetzt habe: = true;

Der Strom funktionierte. aber wenn geprüft wird, ob Assigned (myThread) immer true zurückgibt.
Wie überprüfe ich?

kann sich am Ende im Stream irgendwie aufheben, wie:
Prozedur ausführen;
Selbst: = Null;
end;

Obwohl ich überprüft habe - das gleiche funktioniert nicht ..



testeruser   (2016-01-14 14:21) [1]

Wie die Ausgabe beschlossen hat, eine Prozedur auf OnTerminate aufzulegen, in der die Variable ungültig wird.
kann ich irgendwie ein reguläres verfahren zuordnen?
oder wie kann es in einem einfachen Modul deklariert werden? nicht durch die Formmethode.



Игорь Шевченко ©   (2016-01-14 14:40) [2]


> Wie überprüfe ich?


Auf keinen Fall. Die Verwendung von FreeOnTerminate bedeutet, dass Sie nicht daran interessiert sind, was mit dem Stream nach dem Start geschieht.
Wenn Sie dies überprüfen müssen, verwenden Sie FreeOnTerminate nicht.



testeruser   (2016-01-14 15:23) [3]

Ich bin nicht interessiert, aber ich muss den zweiten Thread nicht starten, wenn der erste nicht funktioniert hat.
und der zweite Start ist verzögert. und ohne FreeOnTerminate wollte ich das nicht. Der ausgegebene Stream hing im Speicher.

Es kann irgendwie einen Zeiger auf die Variable dieses Streams übertragen, um einen Stream zu erstellen.
dann schon im stream mit onterminate auf null.

myThread: TmyThread.create (@myThread)
..
OnTerminate;
beginnen
pointerMyThread ^: = nil;
Ende

Irgendwie so? Ich kann diese @ ^ einfach nicht herausfinden.



testeruser   (2016-01-14 15:30) [4]

PmyThread = ^ TmyThread;

myThread: = TmyThread.Create (@myThread);
..
Prozedur create (val: pointer);
myPointer: = val;
OnTerminate: = OnThreadTerminated;
...

procedure OnThreadTerminated (Absender: TObject);
beginnen
PmyThread (myPointer) ^: = nil;
end;

wird das funktionieren



DVM ©   (2016-01-14 15:43) [5]


> Testerbenutzer (14.01.16 15: 23) [3]

Sie haben nicht den richtigen Ansatz gewählt. Keine Notwendigkeit, Threads zu starten und auszuführen. Verwenden Sie einen Thread-Pool, der auf der Anzahl der Prozessorkerne basiert. Es ist erforderlich, mit Aufgaben zu arbeiten, die in der Warteschlange oder gemeinsam für den Thread-Pool (mit Synchronisierung) oder direkt in der Warteschlange eines bestimmten Threads abgelegt sind. Nach Abschluss der nächsten Aufgabe schläft der Thread in Erwartung der nächsten ein.

Und IMHO ist es besser, diese Funktion "FreeOnTerminate" nicht zu verwenden, sondern alle Ressourcen auf eigene Faust zu kontrollieren.



testeruser   (2016-01-14 16:14) [6]

DVM ©, aber Sie können entweder ein Beispiel lesen, wie man einen Thread auf einem bestimmten Kernel startet?
Ich hatte irgendwo eine Omnithread-Bibliothek. aber für eine einfache anwendung hätte ich gerne etwas einfacheres.
Ja, und es scheint mir, dass mit Ihrem Pool von Threads nur Bugs eine Menge tun werden))



DVM ©   (2016-01-15 11:34) [7]


> Testerbenutzer (14.01.16 16: 14) [6]


> und Sie können entweder ein Beispiel lesen, wo wie auf einem bestimmten
> kernel run thread?

SetThreadAffinityMask ()

https://msdn.microsoft.com/en-us/library/windows/desktop/ms686247%28v=vs.85%29.aspx

100% gibt jedoch keine Garantie, sondern fordert das System lediglich auf, den ausgewählten Kernel zu verwenden.



jack128 ©   (2016-01-15 22:04) [8]


> aber ich muss den zweiten Thread nicht starten, wenn er nicht funktioniert hat
> zuerst.


var InThread: Integer = 0; procedure TForm3.Button1Click (Sender: TObject); var Gewinde: TThread; beginne if InterlockedCompareExchange (InThread, 1, 0) <> 0 then Exit; Thread: = TThread.CreateAnonymousThread (Prozedur beginne versuchen Sie es // arbeite endlich InThread: = 0; Ende; Ende); Thread.Start; Ende;



Игорь Шевченко ©   (2016-01-16 10:18) [9]

jack128 © (15.01.16 22: 04) [8]

Horror



Andy BitOff ©   (2016-01-17 14:07) [10]


> jack128 © (15.01.16 22: 04) [8]

Nun, wenn unter solchen Bedingungen, dann würde ich schreiben:
procedure TForm3.Button1Click (Sender: TObject); var Gewinde: TThread; beginne Button1.Enabled: = False; Thread: = TThread.CreateAnonymousThread (Prozedur beginne versuchen Sie es // arbeite endlich TThread.Synchronize (nil, Prozedur begin Button1.Enabled: = True; end); Ende; Ende); Thread.Start; Ende;


> Igor Shevchenko © (16.01.16 10: 18) [9]
> Horror

Ja nein, normen, cho. Nur ohne Fanatismus.



Seiten: 1 ganze Branche

Forum: "Anfänger";
Aktuelles Archiv: 2017.12.24;
Herunterladen: [xml.tar.bz2];

nach oben









Speicher: 0.59 MB
Zeit: 0.014 c
2-1453069996
Vegarulez
2016-01-18 01:33
2017.12.24
Fehler beim Erstellen des Objekts


2-1453717107
Andrey K
2016-01-25 13:18
2017.12.24
So aktivieren Sie das über den Router verbundene Gerät.


15-1467989201
Kilkennycat
2016-07-08 17:46
2017.12.24
Was ist besser, C # oder Delphi


2-1452769577
Testerbenutzer
2016-01-14 14:06
2017.12.24
Gewinde


2-1452253920
gedevan
2016-01-08 14:52
2017.12.24
Wie SQL-Abfrage auf mehrere Tabellen (ADO, MS Access) machen?





Afrikanisch Albanien Arabisch Armenisch Aserbaidschanisch Baskisch Weißrusse Bulgarian katalanisch Chinesisch (vereinfacht) Chinesische Tradition) kroatisch Tschechisch Dänisch Dutch Englisch estnisch Philippinisch Finnish Französisch
Galicisch Georgisch Deutsch Griechisch haitian Creole Hebräisch Hindi ungarisch isländisch Indonesian irisch Italian Japanisch Koreanisch lettisch litauisch Makedonisch Malay Maltesisch Norwegian
persisch Polnisch Portugiesisch Rumänisch Russisch serbisch Slovakisch Slowenisch Spanisch Suaheli Swedish Thai Türkisch Ukrainisch Urdu Vietnamesisch Walisisch Jiddisch Bengalisch bosnisch
cebuano Esperanto Gujarati Hausa Hmong igbo Javanisch kannada khmer Laotisch Lateinisch Maorisch Marathi Mongolisch nepali Pandschabi Somalisch Tamilisch Telugu Yoruba
Zulu
Английский Französisch Deutsch Italienisch Португальский Russisch Spanisch