"डेल्फी 200 में नया क्या है" के मुताबिक, "प्रतीक्षा श्रृंखला ट्रैवर्सल" नामक एक नई डीबगर विशेषताएं हैं। यह विशेष रूप से कहता है "थ्रेड विवाद या डेडलॉक मुद्दों को हल करने में आपकी सहायता के लिए एक प्रतीक्षा श्रृंखला ट्रैवर्सल सुविधा जोड़ा गया है। यह सुविधा विंडोज विस्टा ऑपरेटिंग सिस्टम में जोड़े गए एक सुविधा पर निर्भर करती है जो आपके एप्लिकेशन के धागे की प्रतीक्षा स्थिति के बारे में डीबगर को जानकारी प्रदान करती है प्रतीक्षा श्रृंखला का रूप। "क्या डेल्फी 200 प्रतीक्षा श्रृंखला ट्रैवर्सल विंडोज 7 इंस्टॉलेशन में उपलब्ध है?
डेल्फी 200 जारी किया गया था जब विंडोज विस्टा वर्तमान ऑपरेटिंग सिस्टम था। मेरे अनुभव से, विस्टा में पेश की जाने वाली अधिकांश सुविधाएं विंडोज 7 में भी उपलब्ध हैं। हालांकि, मुझे डेल्फी एक्सई इंस्टॉलेशन (विंडोज 7 पर सभी) के माध्यम से मेरी डेल्फी 200 9 में कहीं भी यह सुविधा दिखाई नहीं दे रही है।
मैं इस सुविधा को डीबगर के थ्रेड्स फलक पर देख रहा हूं।
क्या मैं सही जगह पर प्रतीक्षा श्रृंखला ट्रैवर्सल की तलाश में हूं?
क्या यह वास्तव में केवल विंडोज़ Vista में उपलब्ध है, न कि विंडोज 7 में?
डेविड एम ने एक अच्छा और स्पष्ट उत्तर प्रदान किया, लेकिन मुझे अभी भी थ्रेड्स फलक में प्रतीक्षा श्रृंखला कॉलम नहीं मिला है। यहां कुछ कोड है।
मुख्य प्रपत्र:
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, SyncObjs, RanThread;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
Button2: TButton;
Label1: TLabel;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure ThreadDone(Sender: TObject);
end;
var
Form1: TForm1;
RanGenThread: TRandomizer;
implementation
uses LoadThread;
{$R *.dfm}
{ TForm1 }
procedure TForm1.ThreadDone(Sender: TObject);
begin
RanGenThread.Free;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ListBox1.Sorted := True;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Thread: TLoader;
begin
ListBox1.Items.Clear;
ListBox1.Sorted := False;
RanGenThread := TRandomizer.Create(True);
RanGenThread.ArraySize := 1000;
Thread := TLoader.Create(True);
with Thread do
begin
RanGenThread.WaitThread := Thread;
FreeOnTerminate := True;
OnTerminate := ThreadDone;
WaitForThread := RanGenThread;
//Use Start in Delphi 2010 or later, where Resume is deprecated
Resume;
end;
RanGenThread.Resume;
end;
initialization
Randomize;
end.
TRandomizer:
unit RanThread;
interface
uses
Classes, Math, SyncObjs;
type
TRandomizer = class(TThread)
private
{ Private declarations }
FArraySize: Integer;
protected
procedure Execute; override;
public
WaitThread: TThread;
RandNumbers: array of Integer;
property ArraySize: Integer read FArraySize write FArraySize;
end;
implementation
uses Main;
procedure TRandomizer.Execute;
var
i: Integer;
LowNum, HighNum: Integer;
RandNum: Integer;
begin
if FArraySize = 0 then
begin
Exit;
end;
SetLength(RandNumbers, FArraySize);
LowNum := Low(RandNumbers);
HighNum := High(RandNumbers);
//initialize the array
for i := LowNum to HighNum do
RandNumbers[i] := -1;
// generate the random order
for i := LowNum to HighNum do
while True do
begin
RandNum := RandomRange(LowNum, HighNum + 1);
if RandNumbers[RandNum] = -1 then
begin
RandNumbers[RandNum] := i + 1;
break;
end; // if
end; // while
WaitThread.WaitFor;
end;
end.
TLoader:
unit LoadThread;
interface
uses
Classes, SyncObjs, Dialogs, SysUtils, RanThread;
type
TLoader = class(TThread)
private
FWaitForThread: TRandomizer;
procedure UpdateList;
{ Private declarations }
protected
procedure Execute; override;
public
property WaitForThread: TRandomizer
read FWaitForThread write FWaitForThread;
end;
implementation
uses Main;
procedure TLoader.UpdateList;
var
i: Integer;
begin
for i := Low(FWaitForThread.RandNumbers) to
High(FWaitForThread.RandNumbers) do
Form1.ListBox1.Items.Add(IntToStr(FWaitForThread.RandNumbers[i]));
end;
procedure TLoader.Execute;
begin
if WaitForThread <> nil then
begin
FWaitForThread.WaitFor;
Synchronize(UpDateList)
end;
end;
end.
इंतजार श्रृंखला ट्रेवर्सल दस्तावेज है कि डेविड एम जुड़ा हुआ के अनुसार करने के लिए, वर्ल्ड ट्रेड सेंटर के लिए उपलब्ध है सिंक्रनाइज़ेशन ऑब्जेक्ट्स के बाद:
- ALPC
- कॉम
- महत्वपूर्ण वर्गों
- Mutexes
- SendMessage
- प्रतीक्षा की प्रक्रिया पर संचालन और धागे
मेरे कोड एक धागे पर इंतजार कर रहा है, लेकिन यह एक TThread है, और सीधे एक मूल धागा नहीं। इस शाम मैं एक म्यूटेक्स की प्रतीक्षा पर डेडलॉक के लिए अपने कोड उदाहरण को संशोधित कर दूंगा, और देख सकता हूं कि परिणाम थ्रेड फलक में दिखाई देने वाली प्रतीक्षा श्रृंखला कॉलम में हैं या नहीं।
ठीक है। अंत में अगले परीक्षण के लिए समय मिला। स्टार्टअप पर एक म्यूटेक्स के स्वामित्व वाले एप्लिकेशन को बनाया गया। उस मटेक्स को एक हैंडल प्राप्त करने के लिए OpenMutex का उपयोग करने वाले वर्कर थ्रेड को बनाया गया और फिर WaitForsingleObject (हैंडल, INFINITE) कहा जाता है। थ्रेड फलक में अभी भी कोई प्रतीक्षा श्रृंखला कॉलम नहीं है।
मैंने टैग 'डेल्फी' जोड़ा क्योंकि यह एक सामान्य टैग है, और आपका प्रश्न कई संस्करणों (200 9, 2010, एक्सई) के बारे में है। मेरे पास एक फ़िल्टर है जो एसओ पर 'डेल्फी' टैग दिखा रहा है, और यह सवाल नहीं था उसमें दिखाओ - मैं दुर्घटना से इसे पार किया। –