小弟刚学VC,遇到一个问题是关于进程与线程的,请各位大哥大姐出手相救啊!小弟走投无路了
这是最基础的用线程创建一个进度条的,问题在我点击之后,什么都没有?思路是这样的:在对话框类的头文件中定义一个全局结构体Threadinfo.用来存储进度条对象的信息。把它...
这是最基础的用线程创建一个进度条的,问题在我点击之后,什么都没有?
思路是这样的:在对话框类的头文件中定义一个全局结构体Threadinfo.用来存储进度条对象的信息。把它作为线程入口函数的参数,并定义三个句柄如下://///////////////////////////////////////////////////////////////////////////
// CMyDlg dialog
typedef struct Threadinfo{
CProgressCtrl *progress;
int speed;
int pos;
}thread,*lpthread;
class CMyDlg : public CDialog
{
// Construction
public:
接着就是在Protected中的代码了:
// Implementation
protected:
HICON m_hIcon;
thread thread1;
thread thread2;
thread thread3;
HANDLE hThread1;
HANDLE hThread2;
HANDLE hThread3;
// Generated message map functions
然后我就定义一个线程函数,当时书上用的是全局的函数,但看了孙鑫老师的视屏的之后,我将它放到了Dlg中,再将其变成是static的,代码如下:
DWORD WINAPI CMyDlg::ThreadFun(LPVOID pthread)
{
lpthread temp=(lpthread)pthread;
temp->progress->SetPos(temp->pos);
while(temp->pos<20)
{
Sleep(temp->speed);
temp->pos++;
temp->progress->SetPos(temp->pos);
if(temp->pos==20)
{
temp->pos=20;
}
}
return true;
}
接下来就是两个BUTTON的向导了:分别如下:
void CMyDlg::OnButton2()
{
// TODO: Add your control notification handler code here
DWORD ThreadID;
DWORD code;
thread1.progress=&m_progress1;
thread1.speed=100;
thread1.pos=0;
if(!GetExitCodeThread(hThread1,&code)||(code!=STILL_ACTIVE))
{
hThread1=CreateThread(NULL,0,ThreadFun,&thread1,0,&ThreadID);
//CloseHandle(hThread1);
}
GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
}
void CMyDlg::OnButton1()
{
// TODO: Add your control notification handler code here
DWORD code;
if(GetExitCodeThread(hThread1,&code))
if(code==STILL_ACTIVE)
{
TerminateThread(hThread1,0);
CloseHandle(hThread1);
}
GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE);
}
其中一个是结束的按钮一个是开放的按钮,由于小弟比较菜,请各位大哥大姐,明说,小弟感激不尽~~~~先谢看完这段代码的好心人了!!!!!有什么好改进的希望都能跟小弟说说。。。。。。 展开
思路是这样的:在对话框类的头文件中定义一个全局结构体Threadinfo.用来存储进度条对象的信息。把它作为线程入口函数的参数,并定义三个句柄如下://///////////////////////////////////////////////////////////////////////////
// CMyDlg dialog
typedef struct Threadinfo{
CProgressCtrl *progress;
int speed;
int pos;
}thread,*lpthread;
class CMyDlg : public CDialog
{
// Construction
public:
接着就是在Protected中的代码了:
// Implementation
protected:
HICON m_hIcon;
thread thread1;
thread thread2;
thread thread3;
HANDLE hThread1;
HANDLE hThread2;
HANDLE hThread3;
// Generated message map functions
然后我就定义一个线程函数,当时书上用的是全局的函数,但看了孙鑫老师的视屏的之后,我将它放到了Dlg中,再将其变成是static的,代码如下:
DWORD WINAPI CMyDlg::ThreadFun(LPVOID pthread)
{
lpthread temp=(lpthread)pthread;
temp->progress->SetPos(temp->pos);
while(temp->pos<20)
{
Sleep(temp->speed);
temp->pos++;
temp->progress->SetPos(temp->pos);
if(temp->pos==20)
{
temp->pos=20;
}
}
return true;
}
接下来就是两个BUTTON的向导了:分别如下:
void CMyDlg::OnButton2()
{
// TODO: Add your control notification handler code here
DWORD ThreadID;
DWORD code;
thread1.progress=&m_progress1;
thread1.speed=100;
thread1.pos=0;
if(!GetExitCodeThread(hThread1,&code)||(code!=STILL_ACTIVE))
{
hThread1=CreateThread(NULL,0,ThreadFun,&thread1,0,&ThreadID);
//CloseHandle(hThread1);
}
GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
}
void CMyDlg::OnButton1()
{
// TODO: Add your control notification handler code here
DWORD code;
if(GetExitCodeThread(hThread1,&code))
if(code==STILL_ACTIVE)
{
TerminateThread(hThread1,0);
CloseHandle(hThread1);
}
GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE);
}
其中一个是结束的按钮一个是开放的按钮,由于小弟比较菜,请各位大哥大姐,明说,小弟感激不尽~~~~先谢看完这段代码的好心人了!!!!!有什么好改进的希望都能跟小弟说说。。。。。。 展开
1个回答
展开全部
1.命名不规范 hThread1 -->m_hThread1 等等
2.参数检查 创建线程时 hThread1 == NULL
3.线程终止时,由于有Terminate终止线程,非常不安全,会导致部分资源不释放,可通过设置检查变量的方式让线程自己结束。你可以打开任务管理器进行多次操作发现内存是否上涨。
4.可通过挂起线程的方式实现,没必要每次都进行创建和终止。
2.参数检查 创建线程时 hThread1 == NULL
3.线程终止时,由于有Terminate终止线程,非常不安全,会导致部分资源不释放,可通过设置检查变量的方式让线程自己结束。你可以打开任务管理器进行多次操作发现内存是否上涨。
4.可通过挂起线程的方式实现,没必要每次都进行创建和终止。
更多追问追答
追问
怎么样才能通过设置检查变量的方式让线程自己结束呢??就麻烦你再打几个字,谢谢你啊
追答
全局或静态变量,BOOL g_bExit1 = FALSE;
在开始时设置
g_bExit1 = FALSE;
结束时
g_bExit1 = TRUE;
并且使用 WaitForSingleObject 等待线程退出
线程函数中
while(temp->pos<20 && !g_bExit1)
推荐使用挂起线程的方式 不要退出线程。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询