多线程问题,请高手进来指点一下。

FigoZhu 2005-04-06 12:53:53
我现在要做一个生成MD5的字典文件的程序,准备用多线程来做。
MD5算法,我做在DLL里面了,现在的问题是,如何用多线程来调用这个DLL,是在每个线程里都LoadLibrary这个DLL吗?
另外,就是线程之间的同步问题(如何把HASH后的内容写到文件中),还有就是如何在主程序的窗口中显示操作的进度(用回调函数,还是用SendMessage向主程序发消息?)
还有就是暂停操作和继续操作如何实现?

一下子,问那么多问题,真是很不好意思,请高手们指点一下,最好能给个多线程的例子看看。
现在一个帖子只能给到100分,另外会再开帖子给分的。

先谢谢各位了!

我的Mail: zhu015502@163.com
...全文
131 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
FigoZhu 2005-04-12
  • 打赏
  • 举报
回复
C++的看不懂啊!
哪位高手给个Delphi的例子啊!
FigoZhu 2005-04-08
  • 打赏
  • 举报
回复
555~~~~ 没人帮我啊!
beyondtkl 2005-04-08
  • 打赏
  • 举报
回复
熟悉C++麼 給呢一個 以前寫的。。。

#include <iostream>
#include <windows.h>
using namespace std;

DWORD g_dwWriteTime = 0;
DWORD g_dwReadTime = 0;
DWORD g_dwRead = 0;
DWORD g_dwWrite = 0;

const DWORD WM_CAN_WRITE = WM_USER + 100;
const DWORD WM_CAN_READ = WM_USER + 101;

//#pragma pack(1)
typedef struct tagTest
{
BYTE bt;
char ch;
}Test;
//#pragma pack()

DWORD WINAPI WriteThread(LPVOID lpVoid)
{
MSG msg;
/* BOOL fQuit = FALSE;
while (!fQuit)
{
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
{
fQuit = TRUE;
}
*/
while (GetMessage(&msg, NULL, 0, 0))
{
if (msg.message == WM_CAN_WRITE)
{
cout << "write #" << ++g_dwWriteTime << " TIMES " << endl;
int* pArray = (int*)lpVoid;
for (int i=0; i<20; i++)
{
pArray[i] = i;
cout << "write in #" << i << endl;
}
PostThreadMessage(g_dwRead,
WM_CAN_READ,
0,
0);
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
//}

return msg.wParam;
}

DWORD WINAPI ReadThread(LPVOID lpVoid)
{
MSG msg;

while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
if (msg.message == WM_CAN_READ)
{
cout << "read #" << ++g_dwReadTime << " TIMES " << endl;
int* pArray = (int*)lpVoid;
for (int i=0; i<20; i++)
{
cout << "read in #" << pArray[i] << endl;
}
PostThreadMessage(g_dwWrite,
WM_CAN_WRITE,
0,
0);
}
}

return msg.wParam;
}

void Init()
{
HINSTANCE hInst = NULL;
typedef DWORD (__stdcall *PRegisterServiceProcess)(DWORD, DWORD);
PRegisterServiceProcess MyReg = NULL;
hInst = LoadLibrary("kernel32.dll");
MyReg = (PRegisterServiceProcess)GetProcAddress(hInst, "RegisterServiceProcess");
if (MyReg != NULL)
{
cout << "MyReg OK" << endl;
}
typedef BOOL (__stdcall *PCloseHandle)(HANDLE);
PCloseHandle CH = NULL;
CH = (PCloseHandle)GetProcAddress(hInst, "CloseHandle");
if (CH != NULL)
{
cout << "CH OK" << endl;
}
}

void main()
{
int nArray[20];
HANDLE hRead, hWrite;

hWrite = CreateThread(NULL,
0,
WriteThread,
nArray, // NULL
0,
&g_dwWrite);
hRead = CreateThread(NULL,
0,
ReadThread,
nArray, // NULL
0,
&g_dwRead);
BOOL fPost;
fPost = PostThreadMessage(g_dwWrite,
WM_CAN_WRITE,
0,
0);
char szErr[30];
DWORD dwErr;
while (!fPost)
{
fPost = PostThreadMessage(g_dwWrite,
WM_CAN_WRITE,
0,
0);
dwErr = GetLastError();
szErr[30] = 0;
if (dwErr != 0)
{
wsprintf(szErr, "MainThread Error ID #%d", dwErr);
cout << szErr << endl;
}
else
{
fPost = TRUE;
}
}
Sleep(5000);
PostThreadMessage(g_dwWrite,
WM_QUIT,
0,
0);
PostThreadMessage(g_dwRead,
WM_QUIT,
0,
0);
/*HANDLE hAll[] = {hWrite, hRead};
WaitForMultipleObjects(2,
hAll,
TRUE,
INFINITE);*/
CloseHandle(hWrite);
CloseHandle(hRead);

cout << "write times " << g_dwWriteTime \
<< " read times " << g_dwReadTime << endl;

system("pause");
}
gogogo 2005-04-08
  • 打赏
  • 举报
回复
呵呵,这个没办法,你必须自己啃下一个多线程例子的,不是很容易几段代码可以说明的,多线程很简单关键是线程同步,还是多啃啃吧,另外说一句不用每个线程都LoadLibrary,只要一个就可以了,你对线程的了解有待提高
beyondtkl 2005-04-08
  • 打赏
  • 举报
回复
樓下的 寫一個。。哈。
hjf8086 2005-04-08
  • 打赏
  • 举报
回复
我也在正在学习tthread
帮你顶顶
FigoZhu 2005-04-06
  • 打赏
  • 举报
回复
拜托啦!!!
有没有有好心的高手,给我个例子学习一下。
只要,最简单的,有进程间同步处理和进度显示的。
FigoZhu 2005-04-06
  • 打赏
  • 举报
回复
最好能给我个简单的例子看一下。
Delphi自带的那个排序的例子看了,没什么收获。
BlueTrees 2005-04-06
  • 打赏
  • 举报
回复
楼上的正解,不过同步,TThread对象有个方法叫做什么名字来着?干吗用的呢?
Sephil 2005-04-06
  • 打赏
  • 举报
回复
1.应该Load一次就可以了,ProcAddress也共享咯,全局变量嘛
2.看看API EnterCriticalSection
3.显示进度 哪个方便用哪个嘛,这没什么好说的吧
4.加个bool的全局变量,在线程里执行操作的时候判断这个值,
或者直接把所有的线程suspend

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧