当“流”遇上“多线程”,难题就出来了!!!(28分)

  • 主题发起人 主题发起人 liqianlong
  • 开始时间 开始时间
L

liqianlong

Unregistered / Unconfirmed
GUEST, unregistred user!
一个事件 procedure abc(Stream: TMemoryStream);
需要我操作Stream 。例如:
procedure abc(Stream: TMemoryStream);
begin
Stream.loadfromfile('c:/1.bmp');
end;

可是,由于种种原因(如:文件很大),我写了一个线程unit去处理这些工作,但是怎么把Stream传递给线程呢?是不是传指针?

这样??
procedure abc(Stream: TMemoryStream);
var TT:TmyThread;
begin

TT:=TmyThread.create(Stream);
end;

我想,这是不正确的~ (全部的分了)
 
procedure mythread.execute;
var
Stream: TMemoryStream;
begin
Stream.loadfromfile('c:/1.bmp');
end;
 
桦树皮,
procedure mythread.execute;
var
Stream: TMemoryStream;
<--------------------这不是局部变量吗???
begin
Stream.loadfromfile('c:/1.bmp');
<-----------所以这有什么用? 事件的 Stream 并没有被操作啊
end;
 
哦,是全局的呀。
你可以通过mythread.create(var Stream: TMemoryStream)把它传到线程里处理呀
 
你为什么不干脆用readfile一点一点读??
 
procedure mythread.execute;
begin
Stream.loadfromfile('c:/1.bmp');
//如果Stream是全局的,在线里直接就能访问呀,这样就行的啊。
end;

 
Stream 肯定不是全局啦~ 是事件abc的一个参数啊~
procedure abc(Stream: TMemoryStream);
begin
Stream.loadfromfile('c:/1.bmp');
end;
 
这样吧,我实在没明白你什么意思,你把你的代码都贴出来吧。我看看
 
procedure abc(Stream: TMemoryStream);
begin
这个过程中的Stream我要用线程去处理它,是不是把Stream的指针传给线程,让线程在执行过程中直接按照指针操作?
end;
 
把这个过程abc放在mythread.execute里不就完事了吗?你想的太复杂了。你不就是想让这个内存流的加载过程在线程进行吗?
procedure mythread.execute;
begin

abc(参数);
end;
 
abc(参数); <---------------可是这是一个控件(组件)发生的一个事件啊!!~
 
尝试一下VCL的同步方法?那个就是线程访问外部内容的技巧,记得VCL代码中有些东西用到了。你看看Classes里面
 
就是传指针呀,但你必须自己做这个流对象的访问同步控制。可以用Event,等方式。
 
访问同步控制!!!~~ 说得好!!!~~ 我就要这个~~~~

可是?怎么做?~ 继续继续~~
 
流 可以有 Event 吗?
在这个例子中,当流被控件(或其他)读取、写入的时候,能获知吗?
真的能够实现“访问同步控制”就好了~ 该怎么做呢?
 
是不是这样:
TMyThread = TThread
private
FMemStream: TMemoryStream;
protected
procedure Execute;override;
public
Constructor Create(Mem: TMemoryStream);
end;

-------------------------------------------------------
Constructor TMyThread.Create(Mem: TMemoryStream);
begin
FMemStream := Mem;
Inherited Create(false);
end;

procedure TMyThread.Execute;
begin
FMemStream.loadfromfile('c:/1.bmp');

end;

procedure abc(Stream: TMemoryStream);
var TT:TmyThread;
begin

TT:=TmyThread.create(Stream);
end;
 
由于流自身保存了一个Position数据,所以它不是线程安全的。
如果需要在线程中使用流,那么最好的办法就是在线程的Execute方法中自己创建Stream,传入线程的只是文件名。
或者就是在线程外创建流,然后将流中的数据读入一个内存结构,然后传给线程。
 
同样Traveller的方法,在线程中创建流!
 
如果是线程中创建流,那么,当线程内的流改变的时候,能够影响线程外的流吗?
 
不会影响,不过这种同步问题也不难解决啊。
 

Similar threads

Q
回复
4
查看
356
穿越沦陷的爱
穿
C
回复
3
查看
366
coolingxyz
C
C
回复
9
查看
248
coolingxyz
C
后退
顶部