使用tthread 的问题(100分)

  • 主题发起人 主题发起人 pazee
  • 开始时间 开始时间
P

pazee

Unregistered / Unconfirmed
GUEST, unregistred user!
我使用了一个activeX控件 MSComm,我想把他动态创建于一个TThread里面,
创建没有问题,但是我只要一对mscomm操作, mscomm 已经注册.把他动态创建于TForm中就没问题。
比如 (borland c++ builder 5.0/ win 2000 pro)
class TComm: public TThread
{
...
public:
TMSComm *MSComm;
...
}
....

__fastcall TComm::TComm():TThread(false)
{
MSComm= new TMSComm(NULL)
// 把Null 变成This 也一样
MSComm->Seting= "9600,8,n,1"
//出错, 不论什么语句只要是对MSComm操作,就出错,告诉不可访问
...
}

程序是我现写的,原码没在身边,可能有语法错误

为什么?TThread 也是从 TObject继承的呀,谁能告诉我如何解决这个问题?
首先,这个控件MSComm不能变,而且必须在这个线程里面。
 
在new TMSComm之前先调用CoInitialize(nil);
别忘了在terminate或者destroy之前调用CoUnInitialize;
 
hello Jams:

我看到你经常使用">>"来保持对贴子的跟踪,可是现在已经有了email通知功能,
不知道你有没有注意过?
〉〉仅仅添加注释,注释内容:(请您注意换行, 如果只想获得email通知,注释可以不填。 )

因此你只需要什么也不写,直接按“发出”按钮就可以了
现在大部分人已经会使用此功能,不知道你没有注意还是有什么其他原因?
 
温柔一刀,
你好,按照你的方法我还是出问题,是不是我理解的有问题?

__fastcall TComm::TComm():TThread(false)
{
CoInitialize(NULL);
this->MSComm= new TMSComm((HWND)NULL)
// 用this 也是又问题
MSComm->CommPort= 3
// 依然出错!!!!!!!
MSComm->Settings= "9600,8,n,1";
}

 
class TComm: public TThread
{
...
public:
TMSComm *MSComm;
__fastcall TComm(TComponent *OA);
...
}
....

__fastcall TComm::TComm(TComponent *OA):TThread(false)
{
CoInitialize(NULL)
// 这句可以没有
this->MSComm= new TMSComm(OA)
// 给MSComm 指定一个真正的父亲 :)
MSComm->CommPort= 3
// 行了!!!!!!!
MSComm->Settings= "9600,8,n,1";
}
........
void __fastcall TForm1::Button3Click(TObject *Sender)
{
TComm *Comm;
Comm= new TComm(this)
////////////////
}

这个解决办法算是我试出来的,没办法从根本上解决,谁知道又没有其他的办法?
感谢温柔一刀,本周内我会结束贴子。
温兄可否简要介绍一下 CoInitialize(NULL),我看msdn看的稀里糊涂的。
 
既然不是CoInitialize(NULL)的问题,那就没什么了
我还真不知道MSCOMM需要一个parent才能用?

CoInitialize(NULL)是初始化COM系统,否则线程中是不能使用COM/OLE调用的
 
没有父亲怎么行,野孩子吗?
 
为什么必须只定存在的父亲,
TForm *frm= new TForm(NULL)
//就行呀!为什么?
请问这个父亲对于TMSComm 有什么意义?负责消息映射?
 
有一些 VCL 控件,如果没有 Owner 或者 Parent ,在刷新或者其他的操作中就会出错,
VCL 是一个完整的体系,比如 TButton 的 ParentFont 属性,如果你手工改变了 Font ,
那么默认会把 ParentFont 改为 False ,此时如果你再把 ParentFont 改为 True ,VCL
就要去访问 Button 的 Parent 以取得 Font 数据,如果没有 Parent ,你说会不会出错?

TMSComm 我没有用过,我认为 TMSComm 应该是 TComponent 的后代,不是 TControl 的
后代,不知道 Parent 对它有什么作用。
 
to BaKuBaku

MSComm 是个ActiveX控件,
这是他在BCB里面的注册之后的描述

class PACKAGE TMSComm : public TOleControl
{
...
virtual __fastcall TMSComm(TComponent* AOwner) : TOleControl(AOwner)
{};
virtual __fastcall TMSComm(HWND Parent) : TOleControl(Parent)
{};}
她不是 TComponent的后代,
它的构造函数可以看出来,它需要一个TComponent.

你的意思是必须给一个TComponent 的Owner?但是我在TForm 类里面就可以让他的
AOwner为空呀?
 
我只是说有些控件需要这个参数啊,并不是所有的控件。 TForm 的 AOwner 就可以为空。
 
多人接受答案了。
 
后退
顶部