2010-11-09 9 views
9

"डेल्फी 200 में नया क्या है" के मुताबिक, "प्रतीक्षा श्रृंखला ट्रैवर्सल" नामक एक नई डीबगर विशेषताएं हैं। यह विशेष रूप से कहता है "थ्रेड विवाद या डेडलॉक मुद्दों को हल करने में आपकी सहायता के लिए एक प्रतीक्षा श्रृंखला ट्रैवर्सल सुविधा जोड़ा गया है। यह सुविधा विंडोज विस्टा ऑपरेटिंग सिस्टम में जोड़े गए एक सुविधा पर निर्भर करती है जो आपके एप्लिकेशन के धागे की प्रतीक्षा स्थिति के बारे में डीबगर को जानकारी प्रदान करती है प्रतीक्षा श्रृंखला का रूप। "क्या डेल्फी 200 प्रतीक्षा श्रृंखला ट्रैवर्सल विंडोज 7 इंस्टॉलेशन में उपलब्ध है?

डेल्फी 200 जारी किया गया था जब विंडोज विस्टा वर्तमान ऑपरेटिंग सिस्टम था। मेरे अनुभव से, विस्टा में पेश की जाने वाली अधिकांश सुविधाएं विंडोज 7 में भी उपलब्ध हैं। हालांकि, मुझे डेल्फी एक्सई इंस्टॉलेशन (विंडोज 7 पर सभी) के माध्यम से मेरी डेल्फी 200 9 में कहीं भी यह सुविधा दिखाई नहीं दे रही है।

मैं इस सुविधा को डीबगर के थ्रेड्स फलक पर देख रहा हूं।

  1. क्या मैं सही जगह पर प्रतीक्षा श्रृंखला ट्रैवर्सल की तलाश में हूं?

  2. क्या यह वास्तव में केवल विंडोज़ 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) कहा जाता है। थ्रेड फलक में अभी भी कोई प्रतीक्षा श्रृंखला कॉलम नहीं है।

+4

मैंने टैग 'डेल्फी' जोड़ा क्योंकि यह एक सामान्य टैग है, और आपका प्रश्न कई संस्करणों (200 9, 2010, एक्सई) के बारे में है। मेरे पास एक फ़िल्टर है जो एसओ पर 'डेल्फी' टैग दिखा रहा है, और यह सवाल नहीं था उसमें दिखाओ - मैं दुर्घटना से इसे पार किया। –

उत्तर

17
  1. हाँ। डेडलॉक के दो धागे के साथ एक प्रोग्राम लिखें। आप थ्रेड फलक पर देखेंगे, दायां हाथ कॉलम ("प्रतीक्षा श्रृंखला" लेबल) कुछ ऐसा कहेंगे जैसे "थ्रेड 12345 द्वारा लॉक की प्रतीक्षा करना।"मैं बिल्कुल सटीक वाक्यांश के बारे में निश्चित नहीं हूं क्योंकि मेरे पास अभी मेरे वर्तमान कार्यक्रम में कोई डेडलॉक्स नहीं है :) यदि आप इसे नहीं देखते हैं, तो सही स्क्रॉल करें। यदि कॉलम बस अस्तित्व में नहीं है, तो यह बहुत अजीब है - एक टिप्पणी में ऐसा कहते कृपया

  2. नहीं रुको श्रृंखला ट्रेवर्सल Vista (और सर्वर 2008) में पेश किया गया था और यह भी विंडोज 7 पर उपलब्ध है आप MSDN documentation on wait chain traversal पढ़ रहे हैं और में से कुछ को देखकर यह देख सकते हैं।। core functions, जिनके पास "न्यूनतम समर्थित क्लाइंट: विंडोज विस्टा" कहकर नीचे तालिका में टिप्पणियां हैं। यह कहेंगे कि अगर इसे विंडोज के बाद के संस्करण में हटा दिया गया था - जिस तरह से इसका वाक्यांश है, वैसे ही यह किसी भी संख्या के लिए है अन्य कार्यों के साथ-साथ, विंडोज 7 (मेरे पास विस्टा) का उपयोग करने वाला एक सहयोगी इस सुविधा में है।

संपादित करें: मैं डेल्फी 2010 में अपने उदाहरण कोड की कोशिश की मेरी Vista मशीन पर (मैं 2009 मुझे डर लग रहा है नहीं है)। मैंने बटन 1 और बटन 2 पर क्लिक किया, और फिर प्रोग्राम को रुकने के बिना थ्रेड दृश्य पर स्विच किया। थ्रेड फलक में 'प्रतीक्षा चेन' कॉलम था, जिसमें दो गैर-मुख्य-धागे धागे 'थ्रेड 11968' या '14416' के लिए अवरुद्ध प्रतीक्षा के लिए पाठ शामिल था।

Wait chain screenshot

ताकि आप अपने आईडीई में मिलना चाहिए यदि यह सुविधा काम कर रहा है है:

यहाँ एक स्क्रीनशॉट है।

जब आप यह कोशिश, आप अन्य स्तंभों नहीं बल्कि प्रतीक्षा चेन स्तंभ मिलता है? यदि ऐसा है तो मैं मानता हूं कि मैं थोड़ा परेशान हूं, और मुझे लगता है कि अगला चरण Embarcadero से संपर्क करना या कम से कम one of their forums पर पोस्ट करना संभव है, शायद this one। मैंने देखा कि प्रतीक्षा श्रृंखला कार्यों के काम के लिए किन अनुमतियों की आवश्यकता है, लेकिन यदि आप वर्तमान उपयोगकर्ता के स्वामित्व वाली प्रक्रिया के साथ काम कर रहे हैं तो यह आपको don't even need SE_DEBUG_NAME जैसा लगता है। (मैं पूरी तरह से निश्चित नहीं हूं कि दस्तावेज़ीकरण की वैध व्याख्या है, लेकिन ...)

मुझे नहीं लगता कि आपका आईडीई अजीब विशेषाधिकारों या एक्सपी संगतता मोड या कुछ भी में चल रहा है? संपादित 4: यह जवाब है। नीचे कैरी की टिप्पणी देखें, शॉर्टकट XP संगतता मोड में चल रहा था।

संपादित करें 2: मैंने सोचा कि मैं एक मानसिक स्वास्थ्य की जांच करते हैं और देखो क्या उनकी मदद फ़ाइल का कहना चाहते हैं। मुझे 200 9 की सहायता ऑनलाइन नहीं मिल रही है, लेकिन 2010 की मदद 'Wait Chain: (For Windows Vista and 7 only)' कहती है। ठंडा। तब मैंने एक्सई सहायता देखी, और यह कहता है 'Wait Chain: (For Windows Vista only)'। बहुत अजीब।

मुझे लगता है कि यह एक प्रलेखन बग है और यह, विंडोज 7 पर काम करने के लिए माना जाता है क्योंकि मैं भी इस Delphi 2009 hotfix for wait chain traversal running on Windows 7 बारे में जाना। मुझे बहुत अच्छा लगता है! कोई रास्ता नहीं है, निश्चित रूप से, वे विंडोज़ के नवीनतम संस्करण के लिए अपने उत्पाद के नवीनतम संस्करण में इस तरह की एक सुविधा को हटा देंगे ... है? । यहां तक ​​कि अगर वे तुम्हें एक संस्करण में काम करने के लिए दस्तावेज का उपयोग कर रहे

संपादित 3 किया था: मैं अपने Windows सहयोगी 7 का उपयोग कर पूछा अपने उदाहरण कोड भी प्रयास करने के लिए। यह वह क्या मिला है:

Wait chain traversal on Windows 7

इस बिंदु मैं मानता हूं मैं थोड़ा हैरान हूँ पर। मैं बस इतना कह सकता हूं कि विंडोज 7 पर आरएडी स्टूडियो 2010 का उपयोग करके काम करता है, और जहां तक ​​मैं कह सकता हूं, आपके लिए काम करना चाहिए। यदि ऐसा नहीं है तो इस समय मेरे ऊपर कुछ अस्पष्ट विचारों से परे कोई और सुझाव नहीं है!

+0

आपके उत्तर के लिए धन्यवाद। ठीक है, यह यहाँ है। मैं इस परीक्षण के लिए डेल्फी 200 9 चला रहा हूं। एक परीक्षण कार्यक्रम में, मेरे पास एक धागा है जो कभी भी अपने निष्पादन विधि से बाहर नहीं निकलता है, और दूसरा जो टीटीएचड.एट का उपयोग करके अनिश्चित काल तक प्रतीक्षा करता है। एक और परीक्षण कार्यक्रम पर, मेरे पास एक धागा है जो कभी भी एक टीवेन्ट को संकेत नहीं देता है, और एक और थ्रेड जो उस टेंवेंट को संकेतित करने की प्रतीक्षा करता है। इन मामलों में से किसी भी मामले में मैंने कभी भी थ्रेड फलक में प्रतीक्षा श्रृंखला कॉलम नहीं देखा है, भले ही मैं दाईं ओर स्क्रॉल करने का प्रयास न करें। असल में, मैंने कभी थ्रेड फलक में प्रतीक्षा श्रृंखला कॉलम नहीं देखा है। मैं विंडोज़ Utlimate 64-बिट चल रहा हूँ। –

+0

उन दोनों परीक्षण मामलों में, एक थ्रेड पर एक धागा deadlocks। हालांकि, आपने कहा "दो थ्रेड जो डेडलॉक।" मैंने परीक्षणों में से एक को संशोधित किया ताकि पहला थ्रेड, जो कभी पूरा न हो, डेडलॉक थ्रेड पर वेटफ़ोर को कॉल करता है। इसलिए, एक दूसरे पर दो धागे deadlocked। मुझे अभी भी प्रतीक्षा श्रृंखला कॉलम नहीं दिख रहा है। मैं मूल प्रश्न में कोड जोड़ दूंगा। –

+0

हाय कैरी - मैंने कुछ जवाबों के साथ अपना जवाब अपडेट किया है और एक स्क्रीनशॉट दिखा रहा है जो मैं देख रहा हूं (Vista पर।) कोई विचार? –