当前位置: 首页 > news >正文

开封网站快速排名优化成都古怪科技网站建设公司

开封网站快速排名优化,成都古怪科技网站建设公司,泉州有那些网站建设公司,电器类网站设计CreateThread函数创建一个进程的新的线程。创建线程必须指定新线程要执行的代码的起始地址。通常#xff0c;起始地址是程序代码中定义的函数的名称#xff08;有关更多信息#xff0c;请参阅ThreadProc#xff09;。此函数采用单个参数并返回DWORD值。一个进程可以让多个线…CreateThread函数创建一个进程的新的线程。创建线程必须指定新线程要执行的代码的起始地址。通常起始地址是程序代码中定义的函数的名称有关更多信息请参阅ThreadProc。此函数采用单个参数并返回DWORD值。一个进程可以让多个线程同时执行相同的功能。 以下是演示如何创建执行本地定义函数的新线程的简单示例MyThreadFunction。 调用线程使用WaitForMultipleObjects函数持久化直到所有工作线程终止。调用线程在等待时阻塞; 为了继续处理调用线程将使用WaitForSingleObject并等待每个工作线程发信号通知其等待对象。请注意如果要在终止之前关闭工作线程的句柄则不会终止工作线程。但是句柄将不可用于后续函数调用。 #include windows.h #include tchar.h #include strsafe.h#define MAX_THREADS 3 #define BUF_SIZE 255DWORD WINAPI MyThreadFunction( LPVOID lpParam ); void ErrorHandler(LPTSTR lpszFunction);// Sample custom data structure for threads to use. // This is passed by void pointer so it can be any data type // that can be passed using a single void pointer (LPVOID). typedef struct MyData {int val1;int val2; } MYDATA, *PMYDATA;int _tmain() {PMYDATA pDataArray[MAX_THREADS];DWORD dwThreadIdArray[MAX_THREADS];HANDLE hThreadArray[MAX_THREADS]; // Create MAX_THREADS worker threads.for( int i0; iMAX_THREADS; i ){// Allocate memory for thread data.pDataArray[i] (PMYDATA) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,sizeof(MYDATA));if( pDataArray[i] NULL ){// If the array allocation fails, the system is out of memory// so there is no point in trying to print an error message.// Just terminate execution.ExitProcess(2);}// Generate unique data for each thread to work with.pDataArray[i]-val1 i;pDataArray[i]-val2 i100;// Create the thread to begin execution on its own.hThreadArray[i] CreateThread( NULL, // default security attributes0, // use default stack size MyThreadFunction, // thread function namepDataArray[i], // argument to thread function 0, // use default creation flags dwThreadIdArray[i]); // returns the thread identifier // Check the return value for success.// If CreateThread fails, terminate execution. // This will automatically clean up threads and memory. if (hThreadArray[i] NULL) {ErrorHandler(TEXT(CreateThread));ExitProcess(3);}} // End of main thread creation loop.// Wait until all threads have terminated.WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);// Close all thread handles and free memory allocations.for(int i0; iMAX_THREADS; i){CloseHandle(hThreadArray[i]);if(pDataArray[i] ! NULL){HeapFree(GetProcessHeap(), 0, pDataArray[i]);pDataArray[i] NULL; // Ensure address is not reused.}}return 0; }DWORD WINAPI MyThreadFunction( LPVOID lpParam ) { HANDLE hStdout;PMYDATA pDataArray;TCHAR msgBuf[BUF_SIZE];size_t cchStringSize;DWORD dwChars;// Make sure there is a console to receive output results. hStdout GetStdHandle(STD_OUTPUT_HANDLE);if( hStdout INVALID_HANDLE_VALUE )return 1;// Cast the parameter to the correct data type.// The pointer is known to be valid because // it was checked for NULL before the thread was created.pDataArray (PMYDATA)lpParam;// Print the parameter values using thread-safe functions.StringCchPrintf(msgBuf, BUF_SIZE, TEXT(Parameters %d, %d\n), pDataArray-val1, pDataArray-val2); StringCchLength(msgBuf, BUF_SIZE, cchStringSize);WriteConsole(hStdout, msgBuf, (DWORD)cchStringSize, dwChars, NULL);return 0; } void ErrorHandler(LPTSTR lpszFunction) { // Retrieve the system error message for the last-error code.LPVOID lpMsgBuf;LPVOID lpDisplayBuf;DWORD dw GetLastError(); FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_IGNORE_INSERTS,NULL,dw,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR) lpMsgBuf,0, NULL );// Display the error message.lpDisplayBuf (LPVOID)LocalAlloc(LMEM_ZEROINIT, (lstrlen((LPCTSTR) lpMsgBuf) lstrlen((LPCTSTR) lpszFunction) 40) * sizeof(TCHAR)); StringCchPrintf((LPTSTR)lpDisplayBuf, LocalSize(lpDisplayBuf) / sizeof(TCHAR),TEXT(%s failed with error %d: %s), lpszFunction, dw, lpMsgBuf); MessageBox(NULL, (LPCTSTR) lpDisplayBuf, TEXT(Error), MB_OK); // Free error-handling buffer allocations.LocalFree(lpMsgBuf);LocalFree(lpDisplayBuf); } 该MyThreadFunction函数避免使用C运行时库CRT因为它的许多函数都不是线程安全的特别是如果您不使用多线程CRT。如果要在ThreadProc函数中使用CRT 请改用_beginthreadex函数。 如果创建线程在新线程之前退出则传递局部变量的地址是有风险的因为指针变为无效。相反要么将指针传递给动态分配的内存要么让创建线程等待新线程终止。数据也可以使用全局变量从创建线程传递到新线程。对于全局变量通常需要通过多个线程同步访问。有关同步的详细信息请参阅同步多个线程的执行。 创建线程可以使用CreateThread的参数来指定以下内容 新线程句柄的安全属性。这些安全属性包括一个继承标志用于确定子进程是否可以继承句柄。安全性属性还包括安全描述符系统使用该描述符在授予访问权限之前对线程句柄的所有后续使用执行访问检查。 新线程的初始堆栈大小。线程的堆栈自动分配在进程的内存空间中; 系统根据需要增加堆栈并在线程终止时释放它。有关更多信息请参阅线程堆栈大小。 一个创建标志使您可以创建处于挂起状态的线程。挂起时线程不会运行直到调用ResumeThread函数。 您还可以通过调用CreateRemoteThread函数来创建线程。调试器进程使用此函数来创建在正在调试的进程的地址空间中运行的线程。 相关话题 终止线程
http://www.zqtcl.cn/news/49752/

相关文章:

  • 网站已经克隆好了 怎么做仿站茂名企业网站开发
  • 杭州网站关键词优化如何解决网站兼容性问题
  • 代做ppt网站好cms建站详细教程
  • 广州达美网站建设手机网站开发利用流程
  • 最好的网页设计网站公司名注册查询
  • c2c有哪些网站网页设计页面代码
  • 做ppt好的模板下载网站有哪些2018淘宝客网站开发
  • 用Off做网站wordpress 表单发邮件
  • 上海做网站大的公司有哪些品牌策划经典案例
  • 网站建设公司-好发信息网网站怎么看是什么程序做的
  • 如何创建网站站点我的百度网盘登录入口
  • 常州发布信息的有什么网站网站建设合同书
  • 网站开发工程师岗位职责说明书河东区腾讯网站建设
  • 企业网站制作查询邯郸信息港房屋出售
  • 四川省中国建设银行招聘信息网站公司官网如何推广
  • 网站活动怎么做的制作免费个人网页
  • 东莞网站搭建找哪里html如何设置背景图片
  • 专业网站建站广告宣传网站
  • 深圳龙岗建网站公司自己做网站费用
  • 在国外建设网站建立网站怎么做关键字
  • 政务中心网站自身建设网站搭建的美工设计
  • 湘阴网站设计商业网站开发入门选课
  • 昆山营销型网站建设网站开发前途
  • 九江网站建设排行榜泰安市人才市场招聘网
  • 网站成立时间查询wordpress增加访问量
  • 企业建设网站的方式有哪些盐城哪家做网站的正规
  • 青岛百度网站排名优化打开手机网站速度慢
  • 渭南建网站南京市规划建设展览馆网站
  • 网站做文献格式广州建设网站是什么样的
  • 怎么用wordpress建外贸网站深圳工业设计展2021