user-0 提问: DLL调用两个函数，一个函数中有while（1），如何实现在另一个函数中终止它

回复:
user: user-1
content: C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 全局变量flag设一个

user: user-3
content: dll的导出函数，就相当于是一个函数功能，只不过封装了一下。 当我们的外部程序在调用dll的接口时，调用该接口的线程或进程，会等顺序执行接口函数的功能；所以，如果我们把while循环写在接口里，例如 void func() {     while(1)     {    ; } }  外部调用部分会一直等待while循环结束才继续往下执行。 这个时候，如果我们想终止这个接口的while循环，就需要另一个线程来做退出处理。 多种思路可解决，核心是多线程。

user: user-4
content: 楼主啊，你对多线程技术有多了解？ 想要编写 MFC 程序，就先要了解多线程技术的。 窗口程序，都会有消息循环和窗口绘制线程的。 楼主的程序出现的问题，应该是，开始循环的函数与结束循环的函数，他们两个的调用者，都是同一个线程了。 你想想看，先调用了一个函数，结果，里面死循环了，无法退出，那么，它怎么有机会调用下一个函数呢？ 要想实现楼主的那个思路，应该是，死循环的代码，要开启新的线程去执行，然后，主线程或者另外的线程来调用后面的函数，结束死循环。  楼主的想法很正确，设置 flag 结束循环，只是忽略了一点， C程序是面向函数的编程语言，一个函数没有返回或者抛出异常，它是无法再执行其他函数的（嵌套调用除外）。每一个线程就可以创建一个新的调用序列，这些调用序列是相对隔离的，如果多个线程调用的函数中，访问了相同的数据，那么，要注意线程安全的问题。

user: user-5
content: 不该说“为了照顾赵4老湿”；应该说“为了追求真理”。 这样才能显出高大上。

user: user-6
content: 最后给一下这个动态链接库的头文件。CSDN不允许连续三次回复，没办法只好等赵4老湿叽叽之后我再回复，哈哈。 // INCLUDE FILE generated by "Pelles C for Windows, version 8.00".  #ifndef _HELLOWD_H #define _HELLOWD_H  #ifdef _HELLOWD_ #define HELLOWDAPI  __declspec(dllexport) #else #define HELLOWDAPI  __declspec(dllimport) #endif /* _HELLOWD_ */  #ifndef WINAPI #define WINAPI  __stdcall #endif  HELLOWDAPI void HelloWorld (void); HELLOWDAPI void stopWhile (void);  #endif /* _HELLOWD_H */

user: user-7
content: while(1){} 通常用于守护或者轮询操作，运行权通常不高，只需要触发一个系统中断（ctrl-break）即可停止其运行。如果从另一个线程终止其运行，只需要从系统发一个停止运行指令即可。

user: user-5
content: 我最后贴的代码不工作吗？ 我倒是没实际测试过。

user: user-6
content: 回楼上，没什么可讨论的，在CSDN混纯粹是瞎耽误工夫，不过还是发一下运行效果截图吧：

user: user-0
content: 我都不太懂，只能默默的看大佬们讨论。

user: user-6
content: 引用 19 楼 赵4老师 的回复:我最后贴的代码不工作吗？ 我倒是没实际测试过。  为了照顾赵4老湿，特地写了一个使用POSIX线程的版本，而且用GCC编译就行。至于WIN32的版本，就不写了，用C写Windows程序太恶心，从赵老湿以往发的程序就能有切实感受。  ----------主程序文件 main.c --------- # include <stdio.h> # include <stdlib.h> # include <windows.h>  int main (int argc, char * argv []) {     typedef void (* PFUNC) (void);      HMODULE hMod = LoadLibrary ("d:\\exampls\\hellowd\\hellowd.dll");      if (hMod != NULL)     {         PFUNC HelloWorld = (PFUNC) GetProcAddress (hMod, "HelloWorld");         PFUNC stopWhile = (PFUNC) GetProcAddress (hMod, "stopWhile");          HelloWorld (); 		MessageBoxW (NULL, L"单击“确定”停止DLL内的循环。", L"hi", MB_OK);         stopWhile ();     }  	getchar ();            //故意添加的代码，以等待DLL内的线程运行结束。 } 编译方法（源字符集-finput-charset需改为你自己使用的字符集）： gcc gcc main.c -finput-charset=gbk -fwide-exec-charset=UTF-16LE    ----------动态链接库文件 hellowd.c --------- # include <stdio.h> # include <windows.h> # include <pthread.h>  BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {     switch (fdwReason)     {         case DLL_PROCESS_ATTACH://各分支内容从略         case DLL_THREAD_ATTACH:         case DLL_THREAD_DETACH:         case DLL_PROCESS_DETACH:             break;     }      return TRUE; }  int flag = 1, i = 0, c = 0;  void * thrd_proc (void * arg) {     pthread_detach (pthread_self ());      while (flag) printf ("%d", c ++);  	MessageBox (0, "The LOOP has been broken!", "Hi", MB_ICONINFORMATION); 	printf ("The LOOP has been broken!\n");  	return 0; }  __declspec(dllexport) void HelloWorld (void) {     MessageBox (0,"Hello World from DLL!", "Hi", MB_ICONINFORMATION);  	pthread_t t;     pthread_create (& t, NULL, thrd_proc, NULL); }  __declspec(dllexport) void stopWhile (void) {     flag = 0;     printf("flag = 0 OK.\n"); } 编译方法：（因为没有使用中文，不需要指定源字符集、执行字符集和宽字符集） gcc hellowd.c -shared -o hellowd.dll

user: user-5
content: 上贴代码最后多了一个}

user: user-5
content: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <windows.h> #include <io.h> #include <process.h> CRITICAL_SECTION cs_log; int No_Loop=0; typedef void (*FUNT)(); FUNT HelloWorld; FUNT stopWhile; void testThread(void *pcn) {     int n,i;      n=(int)pcn;     i=0;     while (1) {         sleep_ms(1000);         EnterCriticalSection(&cs_log);         printf("in testThread %d:i==%ds\n",n,++i);         LeaveCriticalSection(&cs_log);         if (i>=5) {             No_Loop=1;             stopWhile();         }     } } int main(int argc,char * argv[]) {     HMODULE hMod = LoadLibrary("123.dll");     if(hMod == NULL) return 1;      HelloWorld = (FUNT)GetProcAddress(hMod,"HelloWorld");     stopWhile = (FUNT)GetProcAddress(hMod,"stopWhile");      InitializeCriticalSection(&cs_log);      int i;     _beginthread((void(__cdecl *)(void *))testThread,0,(void *)1);     i=0;     while (1) {         Sleep(100);         EnterCriticalSection(&cs_log);         printf("in main:i==%d\n",++i);         LeaveCriticalSection(&cs_log);         HelloWorld();         if (No_Loop==1) break;//     }      DeleteCriticalSection(&cs_log);      return 0; }   }

user: user-8
content: 了解一下win32gui程序的构造

user: user-0
content: 问题就是while(1)放子线程中的话主线程不是也要加while(1)，不然主线程结束子线程也没了

user: user-9
content: 起个线程来调用HelloWorld() 啊，这样就能往下走 调用stopWhile();

user: user-10
content: 引用 楼主 白牙丶 的回复:请教大佬们，DLL是自己写的，调用DLL的两个函数时在一个main函数下的，一个函数有while(1)，怎么用另一个函数终止它。举个例子 创建调用函数： /* Replace "dll.h" with the name of your header */ #include "dll.h" #include <stdio.h> #include <windows.h>  int flag = 1,i = 0;  //创建调用函数 DLLIMPORT void HelloWorld() { 	MessageBox(0,"Hello World from DLL!\n","Hi",MB_ICONINFORMATION); 	 	while(flag) 	{ 		i++; 	} }  //创建调用函数 DLLIMPORT void stopWhile() { 	flag = 0; 	printf("123"); }   BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) { 	switch(fdwReason) 	{ 		case DLL_PROCESS_ATTACH: 		{ 			break; 		} 		case DLL_PROCESS_DETACH: 		{ 			break; 		} 		case DLL_THREAD_ATTACH: 		{ 			break; 		} 		case DLL_THREAD_DETACH: 		{ 			break; 		} 	} 	 	/* Return TRUE on success, FALSE on failure */ 	return TRUE; }  调用： #include <stdio.h> #include <stdlib.h> #include <windows.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop */  int main(int argc, char *argv[]) { 	typedef void (*FUNT)(); 	typedef void (*FUNC)();  	HMODULE hMod = LoadLibrary("123.dll"); 	if(hMod != NULL) 	{ 		//printf("%s\n","success!!!"); 		FUNT HelloWorld = (FUNT)GetProcAddress(hMod,"HelloWorld"); 		FUNT stopWhile = (FUNT)GetProcAddress(hMod,"sendData"); 		 		HelloWorld(); 		stopWhile(); 	} } 怎么用stopWhile去终止Helloworld  你的代码会一直执行Helloworld,根本就走不到stop去 不要把工作放在主线程，放到工作线程中去，这样才有机会去执行stop

user: user-8
content: 单线程你没机会结束它。多线程可以用信号量

user: user-0
content: 引用 3 楼 自信男孩 的回复:while中加上退出条件，在另一个函数里修改这个条件，使条件满足退出while循环；但是程序运行不到下一个函数呀

user: user-0
content: 引用 2 楼 gouyanfen 的回复:FUNT stopWhile = (FUNT)GetProcAddress(hMod,"sendData");? dll导出函数名称代码呢？来个sendData别人不知道是不是stopWhile我错了 忘记修改了