注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Kandy

长风破浪会有时,直挂云帆济沧海!

 
 
 

日志

 
 

创建进程和线程的方法  

2009-10-22 11:28:43|  分类: WIndows程序设计 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

创建进程方法:

1.WinExec("cmd.exe",SW_SHOW);可以隐藏程序界面,一般在后台隐藏执行命令行或脚本时使用
2.system("cmd");直接执行命令,不可以隐藏界面
3.CreateProcess,一般执行带界面的进程,可以隐藏界面,隐藏方法要同时设置dwFlags和wShowWindow

才可以生效,例如:

STARTUPINFO si;

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
si.dwFlags=STARTF_USESHOWWINDOW;
si.wShowWindow=SW_HIDE;
ZeroMemory( &pi, sizeof(pi) );
//watchdog
if( !CreateProcess( NULL,   // No module name (use command line).
   TEXT("test.exe"), // Command line.
   NULL,             // Process handle not inheritable.
   NULL,             // Thread handle not inheritable.
   FALSE,            // Set handle inheritance to FALSE.
   0,                // No creation flags.
   NULL,             // Use parent's environment block.
   NULL,             // Use parent's starting directory.
   &si,              // Pointer to STARTUPINFO structure.
   &pi)             // Pointer to PROCESS_INFORMATION structure.
)
{
   MessageBox("启动失败!");  
   exit(-1);
}


创建线程方法:

1.
HANDLE WINAPI CreateThread(
__in          LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in          SIZE_T dwStackSize,
__in          LPTHREAD_START_ROUTINE lpStartAddress,
__in          LPVOID lpParameter,
__in          DWORD dwCreationFlags,
__out         LPDWORD lpThreadId
);

lpThreadAttributes 用来描述新创建线程的security属性,通常情况下传NULL,即默认属性
dwStackSize 指示线程拥有的堆栈的大小,0代表默认值1M
lpStartAddress 应该传一个函数的指针,该函数不能是类成员函数(static 成员函数除外)
LPTHREAD_START_ROUTINE 定义如下:
typedef DWORD(WINAPI* PTHREAD_START_ROUTINE)
(
LPVOID lpThreadParameter
);
thpedef PTHREAD_START_ROUNTINE LPTHREAD_START_ROUTINE;
该指针函数必须是下面格式:
DWORD _stdcall fun(LPVOID lpThreadParameter);
lpParameter 只是传递给新线程入口函数的参数
dwCreationFlags 指示以何种方式创建新的线程,默认值0表示创建后立即运行该线程,
传递CREATE_SUSPENDED 表示创建一个挂起状态的新线程。
lpThreadId 用来保存新线程的ID。在WinNT操作系统上,可以设置为NULL,表示不需要该ID。
该函数的返回值是一个HANDLE类型的值,代表这个新的线程,使用这个值可以完成许多
其他针对该线程的操作。

VOID ExitThread(DWORD dwExitCode);
该函数接受一个整数值作为线程的返回值,该函数只能在线程内部使用,也就是“自己关闭自己”,
如果在一个线程的外部关闭该线程,需要其他函数的帮忙。


2.下面的这俩函数其实调用了CreateThread 与ExitThread
unsigned long _cdecl _beginthreadex
(void *,
unsigned,
unsigned(_stdcall *) (void *),
void *,
unsigned,
unsigned*);

void _cdecl _endthreadex(unsigned);

3.AfxBeginThread /AfxEndThread

VC 6.0 创建线程的三种方法
1.CreateThread/ExitThread
2._beginthreadex/_endthreadex
3.AfxBeginThread /AfxEndThread

对以上三种方式的选择:
1.在使用了MFC的程序中使用AfxBeginThread函数或者CWinThread::CreateThread函数创建线程。
2.在非MFC工程中,如果要创建多线程,建议使用_beginthreadex
3.避免使用CreateThread函数。不使用_beginthread.
4.线程内部退出函数使用与创建函数配套的函数。
对于高手,参照以下几点:(不推荐)
1.在MFC工程中,如果确定线程中不涉及MFC函数、变量等,可以不适用AfxBeginThread函数或者

CWinThread::CreateThread函数创建。
2.在非MFC中,如果确定函数不调用任何C运行时库函数,可以使用CreateThread


在Windows操作系统上,线程的优先级由低到高被分为32级,用数字0~31来表示,一个
线程的最终"优先级"是由线程本身的优先级和该线程所属的进程的优先级,以及操作系统对其
的调整3中因素共同决定的。

优先权类别(Priority Class)指的是线程所在进程的优先权属性,以数字表示。
优先权类别:
IDLE_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
HIGH_PRIORITY_CLASS
REALTIME_PRIORITY_CLASS

一般进程的优先权类别都为NORMAL_PRIORITY_CLASS 可以调用
SetPriorityClass 和 GetPriorityClass 来设置或者获取进程的优先权级别

BOOL SetPriorityClass(HANDLE hProcess,DWORD dwPriorityClass);
DWORD GetPriorityClass(HANDLE hProcess);
hProcess 代表某个进程的句柄。
dwPriorityClass 为以上4个级别的一个。


优先权层级是指线程的优先级,作为对所在进程的优先权类别的调整,一数字表示。
这样就可以使得一个进程内部的线程之间可以有不同的优先级。层次有7级:
THREAD_PRIORITY_IDLE
THREAD_PRIORITY_LOWEST
THREAD_PRIORITY_BELOW_NORMAL
THREAD_PRIORITY_NORMAL
THREAD_PRIORITY_ABOVE_NORMAL
THREAD_PRIORITY_HIGHEST
THREAD_PRIORITY_TIME_CRITICAL

BOOL SetThreadPriority(HANDLE hThread,int nPriority);
int GetThreadPriority(HANDLE hThread);
hThread 为某个线程的句柄
nPriority 为上述7个级别中的一个

CWinThread类对以上两个函数进行了封装
int CWinThread::GetThreadPriority;
bool CWinThread::SetThreadPriority(int nPriority);


核心对象
从编程语言来说,一个核心对象就是一个整数值。用数据类型HANDLE来表示:

HADNLE 其实就是 void* 类型也是一个指针,在32位Windows平台上就是32位的整数

对于Windows操作系统来说,一个核心对象所代表的远远不止这些。核心对象其实就是
一个"对象",代表着某种事务,该对象由操作系统负责管理,围绕某种对象,通常有
一组API函数负责完成常见的功能。常见的核心对象有一下几种:
进程(Process)
线程(Thread)
文件(File)
事件(Event)
信号量(Semaphore)
互斥体(Mutex)
管道(Named Pipe)
匿名管道(Anonymous Pipe)

BOOL CloseHandle(HANDLE hObj);
CloseHandle函数的作用是负责释放某个拥有着对核心对象的拥有权(计数减一)

  评论这张
 
阅读(829)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017