Hallo Herr Kosch,<br>
auf der Konferenz CD 2001 habe ich unter "Einführung in ADO und ADO Express" was entdeckt, was zwar nix mit ADO zu tun,<br>
aber, was ich schon immer mal wissen wollte.<br>
<pre>
<font face="Verdana" size="1" color="#000000">procedure ADOSelectThread.Execute;
var
aCN : _Connection;
aRS : _RecordSet;
vDummy : OleVariant;
sCount : String;
begin
CoInitialize(nil);
try
aCN := CoConnection.Create;
// Datenbankverbindungs-Pool von ADO, daher keine Nachteile,
// wenn bei jedem Start die Datenbankverbindung neu geöffnet wird
aCN.Open(FConnStr, '', '', adConnectUnspecified);
aCN.Execute('SET LOCK_TIMEOUT 500', vDummy, adExecuteNoRecords);
aRS := CoRecordSet.Create;
aRS.CursorLocation := adUseClient;
aRS.CursorType := adOpenForwardOnly;
aRS.LockType := adLockReadOnly;
aRS.Open('SELECT COUNT(*) FROM KUNDEN WHERE ORT = ' + QuotedStr(FOrt),
aCN, adOpenStatic, adLockReadOnly, adCmdText);
sCount := IntToStr(aRS.Fields[0].Value);
aRS.Close;
aCN.Close;
<b><font face="Verdana" size="1" color="#FF0000">PostMessage(FFrmWnd, PM_LABELTEXT, 0, Integer(PChar(sCount)));
</font></b> finally
CoUninitialize;
end;
end;
</font></pre>
Sie schicken in ADOSelectThread.Execute mit PostMessage den String sCount an das Hauptformular. Nun ja, das ist ja nix besonderes.<br>
Aber was ich noch verstanden habe ist, wo bleibt der String. Es kann doch sein, das der Thread terminiert, bevor das Hauptformular die Message <br>
auswertet. Mit der Message wird doch lediglich ein Zeiger auf sCount übergeben. Aber wenn der Thread terminiert ist sCount<br>
(da sCount sich auf dem Stack befindet) doch weg. Wohin zeigt lParam in der Botschaftsbehandlungsroutine im Hauptformular ?<br>
Kopiert PostMessage etwa den String irgendwo hin?<br>
Jens Schumann<br>
<br>
auf der Konferenz CD 2001 habe ich unter "Einführung in ADO und ADO Express" was entdeckt, was zwar nix mit ADO zu tun,<br>
aber, was ich schon immer mal wissen wollte.<br>
<pre>
<font face="Verdana" size="1" color="#000000">procedure ADOSelectThread.Execute;
var
aCN : _Connection;
aRS : _RecordSet;
vDummy : OleVariant;
sCount : String;
begin
CoInitialize(nil);
try
aCN := CoConnection.Create;
// Datenbankverbindungs-Pool von ADO, daher keine Nachteile,
// wenn bei jedem Start die Datenbankverbindung neu geöffnet wird
aCN.Open(FConnStr, '', '', adConnectUnspecified);
aCN.Execute('SET LOCK_TIMEOUT 500', vDummy, adExecuteNoRecords);
aRS := CoRecordSet.Create;
aRS.CursorLocation := adUseClient;
aRS.CursorType := adOpenForwardOnly;
aRS.LockType := adLockReadOnly;
aRS.Open('SELECT COUNT(*) FROM KUNDEN WHERE ORT = ' + QuotedStr(FOrt),
aCN, adOpenStatic, adLockReadOnly, adCmdText);
sCount := IntToStr(aRS.Fields[0].Value);
aRS.Close;
aCN.Close;
<b><font face="Verdana" size="1" color="#FF0000">PostMessage(FFrmWnd, PM_LABELTEXT, 0, Integer(PChar(sCount)));
</font></b> finally
CoUninitialize;
end;
end;
</font></pre>
Sie schicken in ADOSelectThread.Execute mit PostMessage den String sCount an das Hauptformular. Nun ja, das ist ja nix besonderes.<br>
Aber was ich noch verstanden habe ist, wo bleibt der String. Es kann doch sein, das der Thread terminiert, bevor das Hauptformular die Message <br>
auswertet. Mit der Message wird doch lediglich ein Zeiger auf sCount übergeben. Aber wenn der Thread terminiert ist sCount<br>
(da sCount sich auf dem Stack befindet) doch weg. Wohin zeigt lParam in der Botschaftsbehandlungsroutine im Hauptformular ?<br>
Kopiert PostMessage etwa den String irgendwo hin?<br>
Jens Schumann<br>
<br>
Comment