📄 createprocess.txt
字号:
UINT ThreadFunc(LPVOID param)
{ HDC hdc= GetDC((HWND)param); //获取当前窗口句柄
//获取线程的启动位置
int PointX= m_PointX;
int PointY= 50;
//给出下一个线程的启动位置
m_PointX= m_PointX+30;
ThreadCount= ThreadCount+1;
int MyThreadNum=ThreadCount;
//循环执行代码
while (TRUE)
{ for (inti=0 ; i<250 ; i++)
{
//输出一个红颜色的点
::SetPixel(hdc,PointX,PointY+i,RGB(255,0,0));
::Sleep(10);//延时10毫秒
if (MyThreadNum> ThreadCount) return 0;
};
for (int j=250 ; j>0 ; j--)
{
//输出一个蓝颜色的点
::SetPixel(hdc,PointX,PointY+j,RGB(0,0,255));
::Sleep(10);//延时10毫秒
if (MyThreadNum> ThreadCount) return 0;
}
}
return 0;
}
void CThread1View::OnThreadBegin()
{
HWND hWnd= GetSafeHwnd(); //hWnd为传给函数ThreadFunc的参数
//启动一个线程。
AfxBeginThread(ThreadFunc,hWnd,THREAD_PRIORITY_NORMAL);
//ThreadFunc为线程的控制函数的名称。
//调用全局函数AfxBeginThread来创建一个新的线程。
//线程的优先级定义为标准优先级。
}
void CThread1View::OnThreadEnd()
{
// TODO: Add your command handler code here
ThreadCount=ThreadCount-1; //线程数减1
}
(3) 编制将两个独立应用程序(如记事本和计算器)集成在同一个应用程序中的多进程程序
// procterm项目
# include <windows.h>
# include <iostream>
# include <stdio.h>
static LPCTSTR g_szMutexName= "w2kdg.ProcTerm.mutex.Suicide" ;
// 创建当前进程的克隆进程的简单方法
void StartClone()
{
// 提取当前可执行文件的文件名
TCHAR szFilename[MAX_PATH] ;
:: GetModuleFileName(NULL, szFilename, MAX_PATH) ;
// 格式化用于子进程的命令行,指明它是一个EXE文件和子进程
TCHAR szCmdLine[MAX_PATH] ;
:: sprintf(szCmdLine, "\"%s\"child" , szFilename) ;
// 子进程的启动信息结构
STARTUPINFO si;
:: ZeroMemory(reinterpret_cast<void*>(&si),sizeof(si)) ;
si.cb= sizeof(si) ;// 应当是此结构的大小
// 返回的用于子进程的进程信息
PROCESS_INFORMATION pi;
// 用同样的可执行文件名和命令行创建进程,并指明它是一个子进程
BOOLbCreateOK=::CreateProcess(szFilename,szCmdLine,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi ) ;
// 释放指向子进程的引用
if (bCreateOK)
{
:: CloseHandle(pi.hProcess) ;
:: CloseHandle(pi.hThread) ;
}
}
void Parent()
{
// 创建"自杀"互斥程序体
HANDLE hMutexSuicide=:: CreateMutex(NULL,TRUE,g_szMutexName) ;
if (hMutexSuicide!=NULL)
{
// 创建子进程
std :: cout<< "Creating the child process." << std :: endl;
:: StartClone() ;
// 暂停
:: Sleep(5000) ;
// 指令子进程"杀"掉自身
std :: cout<< "Telling the child process to quit. "<< std :: endl;
:: ReleaseMutex(hMutexSuicide) ;
// 消除句柄
:: CloseHandle(hMutexSuicide) ;
}
}
void Child()
{
// 打开"自杀"互斥体
HANDLE hMutexSuicide= :: OpenMutex(SYNCHRONIZE, FALSE, g_szMutexName) ;
if (hMutexSuicide!= NULL)
{
// 报告我们正在等待指令
std :: cout<<"Child waiting for suicide instructions. " << std :: endl;
:: WaitForSingleObject(hMutexSuicide, INFINITE) ;
// 准备好终止,清除句柄
std :: cout<< "Child quiting." << std :: endl;
:: CloseHandle(hMutexSuicide) ;
}
}
int main(int argc, char* argv[] )
{
// 决定其行为是父进程还是子进程
if (argc>1 && :: strcmp(argv[1] , "child" )== 0)
{
Child() ;
}
else
{
Parent() ;
}
return 0;
}
(4) 编制多纤程程序
#define _WIN32_WINNT 0x0500
#include "windows.h"
#include "iostream.h"
#include "winbase.h"
Struct FiberData
{
void *pfiber1;
void *pfiber2;
void *pfiber3;
};
void _stdcallfiber2(void *)
{
cout<<"Come to fiber #2"<<endl;
int result=0;
FiberData *p=(FiberData*)GetFiberData();
SwitchToFiber(p->pfiber3);
cout<<"Come back to Fiber #2"<<endl;
for(int i=0;i<=100;i++)
result+=i;
SwitchToFiber(p->pfiber3);
cout<<"The sum from 1 to 100 is:"<<result<<endl;
cout<<"switch to main fiber"<<endl;
SwitchToFiber(p->pfiber1);
}
void _stdcallfiber3(void *)
{
FiberData *p=(FiberData*)GetFiberData();
cout<<"Come to Fiber #3 for the first time "<<endl;
SwitchToFiber(p->pfiber2);
cout<<"Come to Fiber #2 again"<<endl;
SwitchToFiber(p->pfiber2);
}
int main (int argc, char* argv[])
{
FiberData fd;
cout<<"Convert thread to fiber"<<endl;
fd.pfiber1=ConvertThreadToFiber(&fd);
cout<<"Create Fiber #2"<<endl;
fd.pfiber2=CreateFiber(0,fiber2,&fd);
cout<<"Create Fiber #3"<<endl;
fd.pfiber3=CreateFiber(0,fiber3,&fd);
cout<<"Switch to Fiber #2"<<endl;
SwitchToFiber(fd.pfiber2);
cout<<"Come to main fiber again"<<endl;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -