LPVOID void*
时间: 2023-12-05 11:06:35 浏览: 44
LPVOID和void*都是指向void类型的指针,LPVOID是Windows API中定义的类型,而void*是C/C++中的通用类型。它们的作用是指向任意类型的指针,可以用于函数参数、返回值等。下面是一个LPVOID和void*的例子:
```c
#include <stdio.h>
#include <windows.h>
void* my_memcpy(void* dest, const void* src, size_t len) {
return memcpy(dest, src, len);
}
int main() {
char src[] = "hello";
char dest[10];
LPVOID lpDest = dest;
my_memcpy(lpDest, src, strlen(src) + 1);
printf("%s\n", (char*)lpDest); // 输出:hello
void* pDest = dest;
memset(pDest, 0, sizeof(dest));
printf("%s\n", (char*)pDest); // 输出空字符串
return 0;
}
```
相关问题
unsigned __stdcall UdpNet:: RecvThread(void* lpVoid) { UdpNet* pThis = (UdpNet*)lpVoid; pThis->RecvData(); return 1; }
这段代码是一个静态成员函数,用于创建一个UDP网络通信的接收线程。首先将传入的参数`lpVoid`强制转换为`UdpNet`类型的指针,然后调用`UdpNet`类的成员函数`RecvData()`实现接收数据的功能。最后返回一个`unsigned`类型的值1。注意,这里使用了`__stdcall`调用约定,它是一种标准的函数调用约定,定义函数参数的压栈顺序、堆栈平衡方式和调用者和被调用者之间的协议。
#include <windows.h> #include <iostream> using namespace std; DWORD WINAPI FunOne(LPVOID param) { while (true) { Sleep(1000); cout << "hello! "; } return 0; } DWORD WINAPI FunTwo(LPVOID param) { while (true) { Sleep(1000); cout << "world! "; } return 0; } int main(int argc, char* argv[]) { int input = 0; HANDLE hand1 = CreateThread(NULL, 0, FunOne, (void*)&input, CREATE_SUSPENDED, NULL); HANDLE hand2 = CreateThread(NULL, 0, FunTwo, (void*)&input, CREATE_SUSPENDED, NULL); while (true) { cin >> input; if (input == 1) { ResumeThread(hand1); ResumeThread(hand2); } else { SuspendThread(hand1); SuspendThread(hand2); } }; TerminateThread(hand1, 1); TerminateThread(hand2, 1); return 0; }
这段代码的问题在于 `TerminateThread` 函数不应该被直接调用,因为它会强制终止线程,可能会导致资源无法正确释放,从而引起一些意外的问题。正确的做法应该是向线程发送一个终止信号,并让线程自己进行清理工作。
另外,这段代码中的 `while (true)` 循环没有进行任何阻塞,会导致 CPU 资源被大量占用。应该使用 `Sleep` 函数或者其他阻塞函数来降低 CPU 占用率。
下面是修改后的代码:
```
#include <windows.h>
#include <iostream>
using namespace std;
volatile bool g_bTerminate = false;
DWORD WINAPI FunOne(LPVOID param) {
while (!g_bTerminate) {
Sleep(1000);
cout << "hello! ";
}
return 0;
}
DWORD WINAPI FunTwo(LPVOID param) {
while (!g_bTerminate) {
Sleep(1000);
cout << "world! ";
}
return 0;
}
int main(int argc, char* argv[]) {
int input = 0;
HANDLE hand1 = CreateThread(NULL, 0, FunOne, (void*)&input, CREATE_SUSPENDED, NULL);
HANDLE hand2 = CreateThread(NULL, 0, FunTwo, (void*)&input, CREATE_SUSPENDED, NULL);
while (true) {
cin >> input;
if (input == 1) {
ResumeThread(hand1);
ResumeThread(hand2);
}
else {
SuspendThread(hand1);
SuspendThread(hand2);
}
};
g_bTerminate = true;
WaitForSingleObject(hand1, INFINITE);
WaitForSingleObject(hand2, INFINITE);
CloseHandle(hand1);
CloseHandle(hand2);
return 0;
}
```
在修改后的代码中,我们使用了一个全局变量 `g_bTerminate` 来表示线程是否应该终止。当用户输入 1 时,程序会恢复线程的执行;当用户输入其他值时,程序会挂起线程的执行。在程序退出时,我们先向线程发送终止信号,然后等待线程正常退出,并释放相关资源。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![cpp](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)