3967| 3
|
[已解决] 如何让delay不占主程序时间 |
1. Windows下同时打开多个对话框:[mw_shl_code=c,true]#include <Windows.h> #include <process.h> //创建线程 void runmsg(void *p) { MessageBoxA(0, "hello world", "hello china", 0); } void main() { _beginthread(runmsg, 0, NULL); //启动线程,函数地址,把函数当做线程的入口点 _beginthread(runmsg, 0, NULL); _beginthread(runmsg, 0, NULL); _beginthread(runmsg, 0, NULL); system("pause"); }[/mw_shl_code] 2. 多线程实现同步和异步: [mw_shl_code=c,true]#include <Windows.h> #include <stdlib.h> //typedef unsigned long DWORD; //#define WINAPI __stdcall 标准的呼叫 //typedef void far *LPVOID; DWORD WINAPI MyMseg(LPVOID lp) { MessageBoxA(0, "hello", "china", 0); } void main() { HANDLE hthread; DWORD threadid; //保存线程编号 //异步执行: //for (int i = 0; i < 5; i++) //{ // hthread = CreateThread( // NULL, //安全属性 // NULL, //堆栈大小 // MyMseg, //线程的入口点 // NULL, //函数的参数 // 0, //立刻执行 // &threadid //保存线程的id // ); //} //多线程实现同步: for (int i = 0; i < 5; i++) { hthread = CreateThread( NULL, //安全属性 NULL, //堆栈大小 MyMseg, //线程的入口点 NULL, //函数的参数 0, //立刻执行 &threadid //保存线程的id ); WaitForSingleObject(hthread, INFINITE); //等待 CloseHandle(hthread); //关闭线程 } system("pause"); }[/mw_shl_code] [mw_shl_code=c,true]#include <stdio.h> #include <stdlib.h> #include <process.h> #include <Windows.h> void run(void *p) { int *px = p; printf("线程编号%d\n", *px); } void main() { int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; for (int i = 0; i < 10; i++) { HANDLE hd = (HANDLE) _beginthread(run, 0, &a); //MyThread线程编号 WaitForSingleObject(hd, INFINITE); //单线程 //WaitForMultipleObjects() //多线程 } system("pause"); }[/mw_shl_code] 3. 多线程检索: [mw_shl_code=c,true]#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <time.h> //生成随机数 #include <process.h> int isfind = 0; //找到设置为1,其他线程就不再查找 struct findInfo { int *pstart; //线程检索的首地址 int length; //检索的数据长度 int findNum; //需要查找的数据 int id; //线程的编号 }; void findIt(void *p) { struct findInfo *ps = p; //保存地址 printf("\n线程%d开始查找\n", ps->id); //遍历首地址,长度为10个元素 for (int *pf = ps->pstart; pf < ps->pstart + ps->length; pf++) { if (isfind == 1) { printf("线程%d结束查找,其他线程已经找到\n", ps->id); return; } if (*pf == ps->findNum) { printf("线程%d结束查找,找到数据%d地址%p\n", ps->id, *pf, pf); isfind = 1; return; } } printf("线程%d结束查找\n", ps->id); } void main() { int a[100] = { 0 }; time_t ts; unsigned int data = time(&ts); srand(data); //随机数种子 for (int i = 0; i < 100; i++) { a = rand() % 100; printf("%4d", a); if ((i+1) % 10 == 0) //每10个打印一行 { printf("\n"); } } int num; printf("输入要查询的数:\n"); scanf("%d", &num); struct findInfo info[10]; //结构体数组,保存每个线程要查找的信息 for (int i = 0; i < 10;i++) { info.pstart = a + 10 * i; info.length = 10; info.findNum = num; info.id = i; _beginthread(findIt, 0, &info); //调用线程 } system("pause"); }[/mw_shl_code] 4. 多线程切割: [mw_shl_code=c,true]#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <Windows.h> #include <time.h> //生成随机数 #include <process.h> int isfind = 0; //找到设置为1,其他线程就不再查找 struct findInfo { int *pstart; //线程检索的首地址 int length; //检索的数据长度 int findNum; //需要查找的数据 int id; //线程的编号 }; #define M 100 //数据 #define N 8 //线程数量 void findIt(void *p) { struct findInfo *ps = p; //保存地址 printf("\n线程%d开始查找\n", ps->id); //遍历首地址,长度为10个元素 for (int *pf = ps->pstart; pf < ps->pstart + ps->length; pf++) { if (isfind == 1) { printf("线程%d结束查找,其他线程已经找到\n", ps->id); return; } if (*pf == ps->findNum) { printf("线程%d结束查找,找到数据%d地址%p\n", ps->id, *pf, pf); isfind = 1; return; } } printf("线程%d结束查找\n", ps->id); } void main() { int a[100] = { 0 }; time_t ts; unsigned int data = time(&ts); srand(data); //随机数种子 for (int i = 0; i < 100; i++) { a = rand() % 100; printf("%4d", a); if ((i+1) % 10 == 0) //每10个打印一行 { printf("\n"); } } int num; printf("输入要查询的数:\n"); scanf("%d", &num); struct findInfo info[N]; //结构体数组,保存每个线程要查找的信息 if (M%N == 0) //前面能整除的情况 { for (int i = 0; i < N; i++) { info.pstart = a + M/N * i; info.length = M/N; info.findNum = num; info.id = i; HANDLE hd = _beginthread(findIt, 0, &info); } } else //不能整除的情况 { for (int i = 0; i < N-1; i++) { info.pstart = a + M / (N-1) * i; info.length = M / (N - 1); info.findNum = num; info.id = i; HANDLE hd = _beginthread(findIt, 0, &info); } //info[N-1]; int i = N - 1; info.pstart = a + M / (N - 1) * i; info.length = M % (N - 1); info.findNum = num; info.id = i; HANDLE hd = _beginthread(findIt, 0, &info); } system("pause"); }[/mw_shl_code] 5. 多线程冲突: [mw_shl_code=c,true]#include <stdio.h> #include <stdlib.h> #include <process.h> #include <Windows.h> #include <time.h> CRITICAL_SECTION cs; //临界区,全局 int num = 0; //全局变量,多线程同时访问会发生冲突 //10 * 100 * 100 DWORD WINAPI myfun(void *p) { for (int i = 0; i < 100; i++) { EnterCriticalSection(&cs); //进入临界区 num++; LeaveCriticalSection(&cs); //离开临界区 //Sleep(10); } return 0; } void main() { time_t start, end; time(&start); HANDLE hd[100]; for (int i = 0; i < 100; i++) { hd = CreateThread(NULL, 0, myfun, NULL, 0, NULL); //hd = _beginthread(myfun, 0, NULL); //线程数组,数组的每一个元素都是一个线程 //WaitForSingleObject(hd, INFINITE); //等待单个的线程结束(同步) } WaitForMultipleObjects(100, hd, TRUE, INFINITE); //等待所有线程退出 time(&end); printf("%f\n", difftime(end, start)); printf("%d\n", num); DeleteCriticalSection(&cs); system("pause"); }[/mw_shl_code] 还有很多可以看这里 C语言多线程编程 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed