मुझे थ्रेड से XE/XE2 में SOAP का उपयोग करने में समस्याएं आ रही हैं। (मैंने पुराने डेल्फी के साथ इसका परीक्षण नहीं किया था।) Invalid pointer operation
के साथ THTTPReqResp उदाहरण को नष्ट करते समय मुख्य थ्रेड में काम करने वाला एक साधारण कोड क्रैश हो जाता है।थ्रेड में THTTPReqResp घटक को नष्ट नहीं कर सकता
यह एक पूरा कार्यक्रम है।
unit Unit79;
interface
uses
SysUtils, Forms, Classes, Controls, StdCtrls, ComObj,
ActiveX, InvokeRegistry, SOAPHTTPTrans, Rio, SOAPHTTPClient;
type
TForm79 = class(TForm)
btnTest: TButton;
procedure btnTestClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form79: TForm79;
implementation
{$R *.dfm}
procedure TForm79.btnTestClick(Sender: TObject);
begin
TThread.CreateAnonymousThread(
procedure
var
FHTTPReqResp: THTTPReqResp;
FHTTPRIO: THTTPRIO;
begin
if CoInitializeEx(NIL, COINIT_MULTITHREADED or COINIT_SPEED_OVER_MEMORY) = S_OK then try
FHTTPReqResp := THTTPReqResp.Create(nil);
with FHTTPReqResp do begin
Name := 'HTTPReqResp1';
UseUTF8InHeader := True;
InvokeOptions := [soIgnoreInvalidCerts, soAutoCheckAccessPointViaUDDI];
WebNodeOptions := [];
end;
FHTTPRIO := THTTPRIO.Create(nil);
with FHTTPRIO do begin
Name := 'HTTPRIO1';
HTTPWebNode := FHTTPReqResp;
end;
//
FreeAndNil(FHTTPRIO);
FreeAndNil(FHTTPReqResp); //<-- crashes here
finally CoUninitialize; end;
end
).Start;
end;
end.
अपवाद _FreeMem फोन पर TObject.FreeInstance में उठाया जाता है: प्रपत्र केवल एक बटन जो btnTestClick ईवेंट ट्रिगर होता है।
procedure TObject.FreeInstance;
begin
CleanupInstance;
_FreeMem(Self);
end;
कॉल स्टैक इस समस्या के लिए अग्रणी
:75bab9bc KERNELBASE.RaiseException + 0x58 System.TObject.FreeInstance System.ErrorAt(2,$4052E1) System.Error(reInvalidPtr) System.TObject.FreeInstance System._ClassDestroy(???) Soap.SOAPHTTPTrans.THTTPReqResp.Destroy System.TObject.Free frmMain.TMainForm.btnTestClick$4934$ActRec.$0$Body System.Classes.TAnonymousThread.Execute System.Classes.ThreadProc($F83530) System.ThreadWrapper($F51050) :76a4339a kernel32.BaseThreadInitThunk + 0x12 :77b59ef2 ntdll.RtlInitializeExceptionChain + 0x63 :77b59ec5 ntdll.RtlInitializeExceptionChain + 0x36
है मैं बिल्कुल पता नहीं क्या, हो रहा है क्यों _ClassDestroy सब पर कहा जाता है और यही कारण है कि कोड दुर्घटनाओं :(किसी सकते हैं कृपया ए) समझाओ कि मैं क्या गलत कर रहा हूं और बी) मेरे कोड को ठीक करें?
डी 2010 में अभी तक CreateAnonymousThread नहीं है। अब गैर-अज्ञात के साथ प्रयास कर रहा है। गैर-अज्ञात धागे के साथ कोई क्रैश नहीं। –
थ्रेडिंग कोई मुद्दा नहीं है (मुझे लगता है)। यह OmniThreadLibrary के साथ दुर्घटनाग्रस्त हो जाता है (जो मुझे यह समस्या मिली थी)। – gabr
थेटप्रियो के प्रलेखन से "जब यह एक शून्य (डेल्फी) या न्यूल (सी ++) पैरामीटर के साथ बनाया जाता है, तो जब संदर्भ गणना शून्य पर गिर जाती है तो यह स्वतः नष्ट हो जाएगी"। आप इसे स्पष्ट रूप से मुक्त कर रहे हैं। –