createthread()

yy9061022 2010-04-29 06:00:26
createthread()
这个怎么使用啊?谢谢指导!
...全文
513 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
SurgePing 2012-09-17
  • 打赏
  • 举报
回复
mark,学习下多线程
尹成 2010-04-29
  • 打赏
  • 举报
回复
使用CreateThread函数创建线程,CreateThread的原型如下:

HANDLE CreateThread(

LPSECURITY_ATTRIBUTES lpThreadAttributes,

DWORD dwStackSize,

LPTHREAD_START_ROUTINE lpStartAddress,

LPVOID lpParameter,

DWORD dwCreationFlags, // creation flags

LPDWORD lpThreadId

);

其中:

lpThreadAttributes表示创建线程的安全属性,NT下有用。

dwStackSize指定线程栈的尺寸,如果为0则与进程主线程栈相同。

lpStartAddress指定线程开始运行的地址。

lpParameter表示传递给线程的32位的参数。

dwCreateFlages表示是否创建后挂起线程(取值CREATE_SUSPEND),挂起后调用ResumeThread继续执行。

lpThreadId用来存放返回的线程ID。

用户界面线程的AfxBeginThread的原型如下:

CWinThread* AFXAPI AfxBeginThread(

CRuntimeClass* pThreadClass,

int nPriority,

UINT nStackSize,

DWORD dwCreateFlags,

LPSECURITY_ATTRIBUTES lpSecurityAttrs)

其中:

参数1是从CWinThread派生的RUNTIME_CLASS类;

参数2指定线程优先级,如果为0,则与创建该线程的线程相同;

参数3指定线程的堆栈大小,如果为0,则与创建该线程的线程相同;

参数4是一个创建标识,如果是CREATE_SUSPENDED,则在悬挂状态创建线程,在线程创建后线程挂起,否则线程在创建后开始线程的执行。

参数5表示线程的安全属性,NT下有用。

// CreateThread.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
using namespace std;
#include <windows.h>

class CThread
{
public:
CThread()
{
m_hThread = NULL;
m_hEventExit = NULL;
}
virtual ~CThread()
{
if (m_hThread)
CloseHandle(m_hThread);
if (m_hEventExit)
CloseHandle(m_hEventExit);
}
HANDLE CreateThread(void)
{
m_hEventExit = CreateEvent(NULL, TRUE, FALSE, NULL);
if (!m_hEventExit)
return NULL;

m_hThread = ::CreateThread(
NULL,
0,
ThreadProc,
this,
0,
&m_dwThreadID);
DWORD dwRet = GetLastError();
}
static DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
CThread* pThread = reinterpret_cast<CThread *>(lpParameter);
if (pThread)
return pThread->Run();
return -1;
}
virtual DWORD Run()
{
cout << "Run..." << endl;
for (;;)
{
DWORD dwRet = WaitForSingleObject(m_hEventExit, 0);
if (dwRet == WAIT_TIMEOUT)
{
cout << "Wait...." << endl;
SuspendThread(m_hThread); //悬挂线程

Sleep(10);
}
else if (dwRet == WAIT_OBJECT_0)
{
cout << "Wait_Object_0..." << endl;
break;
}
else if (dwRet == WAIT_ABANDONED)
{
cout << "ABABDONED..." << endl;
return -1;
}
}
return 0;
}
void Wait(DWORD dwMillseconds = INFINITE)
{
//SetEvent(m_hEventExit);
ResumeThread(m_hThread);//恢复线程
WaitForSingleObject(m_hThread, dwMillseconds);
}
private:
HANDLE m_hThread;
DWORD m_dwThreadID;
HANDLE m_hEventExit;
};

int main(int argc, char* argv[])
{
CThread ct;

HANDLE handle = ct.CreateThread();
Sleep(1000);
ct.Wait();
system("pause");
return 0;
}


文章出处:飞诺网(http://dev.firnow.com/course/3_program/c++/cppjs/2008224/100883.html)
Eleven 2010-04-29
  • 打赏
  • 举报
回复
C++代码的话,用_beginthreadex(),MFC的话可以用AfxBeginThread();
bragi523 2010-04-29
  • 打赏
  • 举报
回复
例:

DWORD WINAPI MyThread( LPVOID lpParam )
{

}


在程序中
DWORD threadID;

HANDLE threadHandle = CreateThread(NULL,0,MyThread,NULL,0,&threadID);//第四个参数可用来传参

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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