begin getmem(DataBuff,256); DataLen:=255; sendpci.dwProtocol:=SCARD_PROTOCOL_T0; sendpci.dbpcilength:=sizeof(sendpci); sl :=TStringList.Create;//存储载入的文本文件 sl.LoadFromFile('c:\cos1.txt'); for l:=0 to sl.Count-1 do //逐行处理 begin sendbuff:=Hex2Bin(sl.Strings[l]); Lensend:=Length(SendBuff); ret:=SCardTransmit(hCard,SendPci,sendbuff,Lensend,SendPci,DataBuff,DataLen); if ret<>0 then begin edit14.Text:='ERROR'; Exit; end; end ; sl.Free; end这是最关键的一步, 屏蔽了这部分就没有问题.还有别的可能的话就是 我在主程序里把 mythread0:=Transmit0.create; mythread0.Resume;放一起了,这样有问题吗
例如你同时拷贝两个文件肯定不如先拷贝其中一个后拷贝另外一个来得快,针对磁盘这种低速设备,交叉读写显然不可取,所以微软会将这种IO操作进行多线程的优化。
而当你下断点了之后,IDE会将进程的所有线程挂起,IO完全空闲了,所以另外的线程自然可以拥有其控制权。以上为个人理解,仅供参考。
暂且不说这样的,极端的做法是复制N份同样的文件,1线程对应abc1.txt,2 线程对应abc2.txt. 这样的话,我也不需要临界区. 每个线程对应单独操作.
我只知道我这样做的结果没有达到预期的目的,也就只能执行一小部分的线程.
这样的话,会产生什么样的问题呢???
begin
getmem(DataBuff,256);
DataLen:=255;
sendpci.dwProtocol:=SCARD_PROTOCOL_T0;
sendpci.dbpcilength:=sizeof(sendpci); sl :=TStringList.Create;//存储载入的文本文件
sl.LoadFromFile('c:\cos1.txt');
for l:=0 to sl.Count-1 do //逐行处理
begin
sendbuff:=Hex2Bin(sl.Strings[l]);
Lensend:=Length(SendBuff);
ret:=SCardTransmit(hCard,SendPci,sendbuff,Lensend,SendPci,DataBuff,DataLen);
if ret<>0 then
begin
edit14.Text:='ERROR';
Exit;
end;
end ;
sl.Free;
end这是最关键的一步, 屏蔽了这部分就没有问题.还有别的可能的话就是 我在主程序里把 mythread0:=Transmit0.create;
mythread0.Resume;放一起了,这样有问题吗
mythread0.Resume;//如果你创建时没把线程挂起,这一句就没什么用,不过有它也不会带来错误
例如:
假设LoadFromFile中用了个FFileName来存文件名
代码是这么写的:
1:FFileName := FileName;
2:AStream := TFileStream.Create(FFileName, fmOpenRead);
3:LoadFromStream(Stream);
假设两个线程同时调用LoadFromFile,线程1执行了第一句,FFileName成了C:\2.txt,然后线程切换了,线程2也执行了第一句,把FFileName改成了C:\3.txt,然后线程再切换,线程1又开始执行,此时LoadFromFile方法就连文件都弄错了
所谓线程安全就是方法里面考虑了多线程情况,会针对它进行处理保证其不会出错。