| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 814 人关注过本帖
标题:线程类中使用其他类的变量不能赋值
只看楼主 加入收藏
friendygm
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-3-4
收藏
 问题点数:0 回复次数:1 
线程类中使用其他类的变量不能赋值
在创建了一个线程之后,需要在线程中使用一个类变量,在对这个类变量进行赋值的时候程序挂掉

请问程序是什么地方有错呢?

请大牛指点指点!

下面是源码

interface

uses
  Classes, SPComm, Windows, DataType, Contnrs, SyncObjs;

type
  PTComm = ^Tcomm;
  Thread485 = class(TThread)
  private
    { Private declarations }
    Comm : PTComm;
    S : TStrings;
    CriticalSection : TCriticalSection;
    MsgQuene : TObjectQueue;
  protected
    procedure Execute; override;
  public
    constructor Create(AComm:PTComm; ASuspended : Boolean);
    procedure Push(s : TStrings);
    function Pop:TStrings;
    function Peek:TStrings;
    function MsgCount:Integer;
  end;


implementation

{ Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure Thread485.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }

{ Thread485 }
constructor Thread485.Create(AComm:PTComm; ASuspended : Boolean);
begin
  inherited Create(ASuspended);
  FreeOnTerminate := True;

  Comm := AComm;
  try
    Comm.StartComm;
  except
    Terminate;
  end;

  S := TStrings.Create;
  Beep(1000,100);
  s.Text := 'ygm  ';//在这里出错挂掉
end;

procedure Thread485.Execute;
var
  st : string;
begin
  while not Terminated do
  begin
    st := s.Text;
    Comm.WriteCommData(PChar(st), Length(st));
    Sleep(1000);
  end;

  s.Free;
  Comm.StopComm;
end;

procedure Thread485.Push(s:TStrings);
begin
  CriticalSection.Enter;
  MsgQuene.Push(s);
  CriticalSection.Leave;
end;

function Thread485.Pop:TStrings;
begin
  CriticalSection.Enter;
  Result := TStrings(MsgQuene.Pop);
  CriticalSection.Leave;
end;

function Thread485.Peek:TStrings;
begin
  CriticalSection.Enter;
  Result := TStrings(MsgQuene.Peek);
  CriticalSection.Leave;
end;

function Thread485.MsgCount:Integer;
begin
  CriticalSection.Enter;
  Result := MsgQuene.Count;
  CriticalSection.Leave;
end;

end.

搜索更多相关主题的帖子: 变量 赋值 线程 
2010-03-04 10:48
friendygm
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-3-4
收藏
得分:0 
知道了,Create中应该把所有的变量进行初始化
2010-03-04 13:00
快速回复:线程类中使用其他类的变量不能赋值
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017569 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved