请教高手~~怎么在Dll或者自己继承的Thread多线程中使用非可视化控件呢?

christopher_hp 2003-02-16 11:18:42
怎么在Dll或者自己继承的Thread多线程中使用非可视化控件呢?
我想用多线程来发信,或者在dll中向我自己的信箱发信怎么做不到了
我是
TNMSMTP *stmp;
申明了一个,可是设置它的属性如Host就出错了,提示是什么BPL文件错误,
头文件都包含了的的,可是。。。
...全文
55 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
christopher_hp 2003-02-25
  • 打赏
  • 举报
回复
to lanren_me(阿波)
不明白你的意思
说明白一点可以吗
lanren_me 2003-02-24
  • 打赏
  • 举报
回复
估计非可视控件的使用应该一样;
lanren_me 2003-02-24
  • 打赏
  • 举报
回复
//线程中:我的例子:

h:
.....
protected:
TCGauge *CGauge;


.....


cpp:

__fastcall Tcolledata::Tcolledata(bool CreateSuspended)
: TThread(CreateSuspended)
{
CGauge= new TCGauge(NULL);

}

//同步函数中:

CGauge->Color=clBtnFace;
CGauge->ForeColor=clNavy;
MainForm->StatusBar->Panels->Items[0]->Style=psOwnerDraw;
CGauge->Top=MainForm->ProgressBarRect.Top;
CGauge->Left=MainForm->ProgressBarRect.Left;
CGauge->Height=MainForm->ProgressBarRect.Bottom-MainForm->ProgressBarRect.Top;
CGauge->Width=MainForm->ProgressBarRect.Right-MainForm->ProgressBarRect.Left;
CGauge->Visible=true;
CGauge->Parent=MainForm->StatusBar;
CGauge->MinValue=0;
CGauge->MaxValue=1000;
CGauge->AddProgress(1);


__fastcall Tcolledata::~Tcolledata()
{
CGauge->Visible=false;
delete CGauge;
}
christopher_hp 2003-02-24
  • 打赏
  • 举报
回复
jishiping(JSP 季世平)
那该怎么做呢?不可能把多个文件的内容放在一个文件里面发送吧 ?

jishiping 2003-02-20
  • 打赏
  • 举报
回复
BCB的线程没有消息循环,而TNMSMTP使用消息驱动,所以不行。
christopher_hp 2003-02-20
  • 打赏
  • 举报
回复
这就是线程发送邮件的代码,可以在总是出错,
如果是在Form里面就不会出错了
不知道为什么!!1
christopher_hp 2003-02-20
  • 打赏
  • 举报
回复
TNMSMTP *smtp1;

__fastcall TSendThread::TSendThread(AnsiString server, AnsiString name, \
AnsiString pass, AnsiString receive, \
int count, AnsiString file, \
bool CreateSuspended)
: TThread(CreateSuspended)
{
index = 0;
Server = server;
Name = name;
Pass = pass;
Receive = receive;
File = file;
Count = count;
smtp1 = new TNMSMTP(NULL);
smtp1->OnConnect = Connect;
smtp1->OnInvalidHost = InvalidHost;
smtp1->OnSuccess = Success;
}
//---------------------------------------------------------------------------
void __fastcall TSendThread::Execute()
{

Doing();
//---- Place thread code here ----
}
//---------------------------------------------------------------------------
void __fastcall TSendThread::Connect(TObject *Sender)
{
smtp1->Transaction("auth login");
smtp1->Transaction(Name);
smtp1->Transaction(Pass);
}
void __fastcall TSendThread::InvalidHost(bool &Handled)
{
MessageBox(0, "无效的主机地址", "Mail Bome", MB_ICONERROR|MB_OK);
Handled = false;
}
void __fastcall TSendThread::Failure(TObject *Sender)
{
MessageBox(0, "连接主机失败", "Mail Bome", MB_ICONERROR|MB_OK);
}
void __fastcall TSendThread::Success(TObject *Sender)
{
index++;
if(index < Count)
{
try
{
if(!smtp1->Connected)
smtp1->Connect();
smtp1->PostMessageA->FromAddress = Receive;
smtp1->PostMessageA->ToAddress->Text = Receive;
smtp1->PostMessageA->Body->LoadFromFile(File);
smtp1->PostMessageA->Subject = "Bome with E-mail";
smtp1->SendMail();
}
catch(...)
{
ShowMessage("再次发送邮件出错");
}
}
else
{
delete smtp1;
smtp1 = NULL;
ShowMessage("线程发送邮件成功!");
}
}
void __fastcall TSendThread::Doing()
{
if (smtp1->Connected)
smtp1->Disconnect();
smtp1->Host = Server;
smtp1->UserID = Name;
try
{
smtp1->Connect();
if (smtp1->Connected)
{
smtp1->PostMessageA->FromAddress = Receive;
smtp1->PostMessageA->FromName = "Mail Bome";
smtp1->PostMessageA->ToAddress->Text = Receive;
smtp1->PostMessageA->Body->LoadFromFile(File);
smtp1->PostMessageA->Subject = "Bome with E-mail";
smtp1->PostMessageA->Date = Now();
smtp1->SendMail();
}
}
catch(...)
{
ShowMessage("发送文件出错");
}
}
christopher_hp 2003-02-19
  • 打赏
  • 举报
回复
线程的问题总算解决了,可是还有一个问题就是,如果我在form中的smtp的success中加如一个变量控制发送邮件的数量,就可以连续发邮件,可是用线程去做不到,不知道是什么原因!!!
请教线程中是否还有些事情要注意呢?
等会我把线程的代码贴出来,希望各位解答一下!!!
albeta 2003-02-17
  • 打赏
  • 举报
回复
应该是:
TNMSMTP *stmp = new TNMSMTP(Application);
...
delete stmp;
你的代码没有实例化控件,当然出错。还有,如果控件用到了Windows的消息,你恐怕就要定义一个不可见窗体了。
invalid 2003-02-17
  • 打赏
  • 举报
回复
把组件放在数据模块窗口。
给数据模块增加一个Public方法如:SendMail。SendMail中完成发送邮件功能。写好相关代码。
在dll工程中加入此数据模块。保护头文件。
写你的dll导出函数,在函数中创建数据模块,然后调用数据模块的方法SendMail。
然后删除数据模块。
christopher_hp 2003-02-16
  • 打赏
  • 举报
回复
说的明白一点可以吗
invalid 2003-02-16
  • 打赏
  • 举报
回复
可以放在TDataModule中。包装成方法。dll中调用方法就是了。

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧