//程序1
CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(TSharedMemData), 'test');
//程序2
OpenFileMapping(FILE_MAP_WRITE, False, 'test');
//==========================================================================================
//程序1(这代码在一个线程里)
// MemData 为程序全局变量
// MemData:=OpenFileMapping(FILE_MAP_WRITE, False, 'test');
function (name:string):TData;
begin
MemData.Str1:='我靠';
MemData.Status:=2;//标记为保存
while (True) do begin
if MemData.Status = 22 then begin//保存OK标记
move(MemData.Data,result,sizeof(TData));
MemData.Status := 0;
break;
end;
end;
end;程序2(这代码在一个Timer事件里间隔 1毫秒)
// MemData 为程序全局变量
// MemData:=OpenFileMapping(FILE_MAP_WRITE, False, 'test');
var
MemData:TSharedMemData;
tmpData:TData;
begin
MemData:=OpenFileMapping(FILE_MAP_WRITE, False, 'test');
if MemData.Status = 2 then begin
move(MemData.Data,tmpData,sizeof(TData));
if save(Data.Str1,tmpData) then MemData.Status:=22;
end;
end;
function save(name:string;Data:TData):boolena;
var
SqlTiaoJian:string;//SQL条件
begin
SqlTiaoJian := copy(name,1,length(name));//直接 := 也行 只是出了这个问题怀疑是这个原因所以先Copy
fillchar(Data,sizeof(TData),0);
SqlStr := 'SELECT * FROM TAB1 WHERE (Name=' + '''' + SqlTiaoJian+ '''';
ADOQueryLoad.SQL.Add(Sqlstr);
ADOQueryLoad.Active := True;
...........................
end;
执行到 save SqlTiaoJian 总是变'' 不知何解
解决方案 »
- 数据存取问题```高分````
- 界面不显示了,怎么办呢?
- 动态创建登入验证窗体问题
- 聊天程序如何通过局域网
- IdDNSResolver1.ClearVars以及IdDnsResolver1.DNSHeader如何在Indy9中实现(得到)?
- 请问:怎样做流程图,并实现导航,在form里?
- 根据这个表的字段,怎样查询2003-10-2 9:00:00 到2003-10-3 7:30:00的记录呢?
- form的最大化
- 如何获取两个字符串的相同字符数目??
- 一个sql 脚本文件怎么在delphi中执行?
- 打印机有多个纸盒,fastreport 打印如何选择纸盒
- parameters.ParamByName和parameters.ParamValues的疑惑(请看倒数5至7行)
function save(name:string;Data:TData):boolena;
name传进来就是 ''
function (name:string):TData;
begin
MemData.Str1:='我靠';
MemData.Status:=2;//标记为保存
Sleep(1000);//这样也没用
while (True) do begin
if MemData.Status = 22 then begin//保存OK标记
move(MemData.Data,result,sizeof(TData));
MemData.Status := 0;
break;
end;
end;
end;
// MemData 为程序全局变量 你加个线程同步试下
程序2 什么都不做的 就只有个 Time 不停的循环检测
Var
PMemData:TSharedMemData;
begin
...
PMemData := MapViewOfFile(MemData,FILE_MAP_ALL_ACCESS,0,0,0);
Form1: TForm1;
hMap: THandle;
aUserMsg: TMsg;
PUserMsg: PMsg;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
hMap:=CreateFileMapping($FFFFFFFF,
nil,
PAGE_READWRITE,
0,
SizeOf(TMsg),
'MsgReceptor'); if hMap=0 then
raise Exception.Create('Error while create file')
else
label1.Caption := 'Memory mapping has created.';
PUserMsg:=MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,0,0,0);
if PUserMsg = nil then
begin
CloseHandle(hMap);
ShowMessage('Can''t view of Memory map');
Application.Terminate;
exit;
end;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
if PUserMsg <> nil then
UnmapViewOfFile(PUserMsg);
if hMap<>0 then
CloseHandle(hMap);
end;procedure UserMemoryMapping;
var
hnd: THandle;
begin
hnd:=OpenFileMapping(FILE_MAP_WRITE,False,'MsgReceptor');
if hnd<>0 then
begin
PUserMsg:=MapViewOfFile(hnd,FILE_MAP_WRITE,0,0,0);
PUserMsg^.hwnd := Form1.Edit2.Handle;
SendMessage(PUserMsg.hwnd,PUserMsg.message,PUserMsg.wParam,PUserMsg.lParam);
UnmapViewOfFile(PUserMsg);
CloseHandle(hnd);
end;
end;procedure TForm1.SetMessage;
var
s:String;
pc:PChar;
begin
s := 'TEst';
pc := PChar(s);
with aUserMsg do
begin
hwnd := Edit1.Handle;
message := WM_SETTEXT;
wParam := 0;
lParam := Integer(pc);
time := 0;
pt := Point(0,0);
end;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
SetMessage;
CopyMemory(PUserMsg,@aUserMsg,SizeOf(TMsg));
end;procedure TForm1.Button3Click(Sender: TObject);
begin
UserMemoryMapping;
end;end.
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls,Smem;type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
MemData:pTSharedMemData=nil;
implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
MemData :=Smem.initializeSharedMemData;
if MemData =nil then ShowMessage('Nil');
end;
function loadForSQL(name:string;Data:pTData):Integer;
var
tmpName:string;
begin
Form1.Caption := name+':'+inttostr(Random(99999));
//ShowMessage(name);//问题就在这有时候它是空
Result := -1;
tmpName:= Copy(name,1,Length(name));
//注意name 是Data.sName 所以我担心FillChar 会把他清空所以copy
FillChar(Data^,SizeOf(TData),0);
//从SQL 读数据到 Data............ //读完了返回 22
Result := 22;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
i:Integer;
SaveData:pTSaveData;
begin
for i := 0 to 99 do begin
SaveData:[email protected][i];
if SaveData.Status = 2 then //
SaveData.Status:=loadForSQL(SaveData.Data.sName,@SaveData.Data);
end;
end;end.unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,Smem;type TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public end;
TLoadEngine = class(TThread) protected
procedure Execute; override;
end;
procedure Load(Name:string;LoadData:pTData);
var
Form1: TForm1;
MemData:pTSharedMemData=nil;
LoadEngine:TLoadEngine;
implementation{$R *.dfm}
procedure TLoadEngine.Execute;
var
Data:pTData;
begin
// for list....
New(Data);
Load('王清',Data);
Dispose(Data);
Sleep(10);//实际代码中没这个
//end ....
end;procedure TForm1.FormCreate(Sender: TObject);
begin
MemData :=initializeSharedMemData;
if MemData =nil then ShowMessage('Nil');
LoadEngine:=TLoadEngine.Create(False);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
LoadEngine.Free;
end;
procedure Load(Name:string;LoadData:pTData);
var
dwTimeOutTick: LongWord;
i:Integer;
Data:pTSaveData;
begin
Data:=nil;
for i := 0 to 99 do begin
if MemData.Data[i].Status = 0 then
begin
Data :[email protected][i];
Break;
end;
end;
if Data = nil then begin
ShowMessage('读取失败,无空闲');
Exit;
end;
Data.Data.sName := Name;
ShowMessage('读取::'+Data.Data.sName);
//Sleep(1000);
Data.Status := 2;
dwTimeOutTick := GetTickCount();
while (True) do begin
if (GetTickCount - dwTimeOutTick) > 5000 then begin
ShowMessage('读取失败超时');
break;
end;
if Data.Status >= 0 then begin
if Data.Status = 22 then
begin
//if HumanData. = sCharName then
//begin
Move(Data.Data, LoadData^, sizeof(TData));
{end
else
Result := False; }
Data.Status:=0;
Break;
end;
end else begin
ShowMessage('读取失败 Status');
break;
end;
Sleep(1);
end;
end;
end.