请教作三层的高手们(100分)

  • 主题发起人 主题发起人 ice-sword
  • 开始时间 开始时间
I

ice-sword

Unregistered / Unconfirmed
GUEST, unregistred user!
1。在服务器上写方法时,若该方法使用了多线程的技术,用来在服务器所在的机器上
作一件事情(不是与客户端通讯)如读写文件,在程序中使用该方法的时候应当注意什么
2。我在应用服务器上写了一个方法,调用了一个用VC作的dll中的函数,这个函数可能
使用多线程来读文件,结果在服务器一调用这个方法就出现"catastrophic failure"
在服务器上还写了其他方法,调用了该DLL中的其它函数(未用多线程技术)结果一切正常
结构为
A客户端-SOCKETCONNECTION
B服务器端-MULTIPLE,远程调用方式 LATE BINDING
 
线程必须在进程内运行!USE WINSIGN看看!
 
>>rax
多谢指教,不过
case 'use winsign 的意思' of
'在程序use列中引入winsign': ERROR--> 系统不承认有这个dcu
'使用winsign这个程序':ERROR-->> 找不到这个函数
end;
请再指点一二
 
应该是Delphi所带的WinSight工具
 
我想这可能不是DLL的问题。如果你的应用服务器是多线程的,那么多个线程中
是对一个文件操作就会有问题,你必须要写线程同步代码。
 
>>to guerilla
确实是winsight.exe,不过不太懂他和调试程序有什么关系,可否再细讲一下,加上
10分先。
>>to hongjiang
线程同步代码是怎样写的,可否贴段代码,也先加10分
>>>to rax,guerilla,hongjiang
提的问题已经解决,实际上与多线程无关,问题的原因在于,当远程调用DLL时程序的
默认当前路径会变化为‘C:/WINNT/SYSTEM32’所以找不到DLL,解决方法为在函数前加
‘SETCURRENTDIR('DLL的路径')’,但奇怪的是调用DLL中的其他函数时不设置路径仍可用。
试了两天才成功,我几乎精疲力尽了。
 
线程同步可以采用多种方法,critical section,Mutex,semaphore等
下面是一个Mutex的例子:
var
hMutex: THandle;
begin
hMutex:=CreateMutex(nil,False,'Mutex Name');
if hMutex=0 then
begin
ShowError('Create Mutex Failed');
Exit;
end;

if WaitForSingleObject(hMutex,5000) <> WAIT_OBJECT_0 then
begin
CloseHandle(hMutex);
ShowError('Timeout');
Exit;
end;

try
//Do what you want todo
finally
CloseHandle(hMutex);
end;
end;
 
多人接受答案了。
 
后退
顶部