程式運行沒有問題,但一旦點擊關閉就報錯 invalid pointer operation, 在參考單元加了 ShareMem還是報錯,在delphi 目錄僅能找到檔案:borlndmm.dll,并且relector打開也看不到里面什么東東,請高手指點一下,附代碼:
unit Unit1;
interface
uses
ShareMem,Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls,Unit2,
OleCtrls,Registry,ComObj,StrUtils;
type
TForm1 = class(TForm)
Timer1: TTimer;
Memo1: TMemo;
Timer2: TTimer;
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
i:integer;
hThread:THandle;
implementation
{$R *.dfm}
function ForLoop1(p:Pointer):Integer;stdcall;
var
i:integer;
begin
for i:=1 to 500 do
begin
Form1.Caption:=inttostr(i);
Form1.Memo1.Lines.Add(RightStr(DateTimetostr(now()),8)+'_'+inttostr(i));
end;
Result:=0;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
ID:DWORD;
begin
Timer1.Enabled:=false;
hThread:=CreateThread(nil,0,@ForLoop1,nil,0,ID);
end;
end.
uj5u.com熱心網友回復:
執行緒資源未被釋放簡單的辦法是建立強制退出標記,在執行緒創建時記錄增加執行緒總數,在執行緒結束時記錄減少執行緒總數,在FORM的close事件中將強制退出標記賦值,執行緒函式遇到強制退出標記則馬上 結束執行緒
這樣應該就可以不出現錯誤 了
uj5u.com熱心網友回復:
很顯然, 主表單關閉了, 執行緒還未結束。uj5u.com熱心網友回復:
這是無效的指標操作。取消ShareMem單元后,不再退出時出現錯誤資訊。
至于你的其它問題,無代碼也就無語了。
測驗代碼如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
StrUtils, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Timer1: TTimer;
Button1: TButton;
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
i:integer;
hThread:THandle;
implementation
{$R *.dfm}
function ForLoop1:Integer;stdcall;
var
i:integer;
begin
for i:=1 to 500 do
begin
Form1.Caption:=inttostr(i);
Form1.Memo1.Lines.Add(RightStr(DateTimetostr(now()),8)+'_'+inttostr(i));
end;
Result:=0;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var ID:DWORD;
begin
Timer1.Enabled:=false;
hThread:=CreateThread(nil,0,@ForLoop1,nil,0,ID);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
close;
end;
end.
uj5u.com熱心網友回復:
補充:經檢測執行緒,已經關閉。不是執行緒未關閉。uj5u.com熱心網友回復:
無效的指標操作,另外在執行緒中訪問UI界面控制元件,需要增加執行緒同步,另外退出程式的時候,還需要向執行緒發送退出結束訊息,這兩點你都沒做處理。uj5u.com熱心網友回復:
你是如何檢測執行緒已經關閉呢?執行緒執行的詩歌for回圈, 很快就會結束。
當你關閉表單時, 如果執行緒正在運行,正在for回圈中,就會出現invalid pointer operation,。
另外, 樓上說的也很在理!
uj5u.com熱心網友回復:
按此代碼執行,再加入你的其它代碼,試試。
uj5u.com熱心網友回復:
1、表單關閉,執行緒未結束2、執行緒中用了VCL,需要特殊處理
uj5u.com熱心網友回復:
很明顯示,執行緒中使用了ForLoop1這個函式,而這個函式中的回圈是使用VCL控制元件的。報錯在情理之中....轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/72918.html
