求救关于大数据量网络传输和多线程的问题!(200分)

  • 主题发起人 主题发起人 忧郁骑士
  • 开始时间 开始时间

忧郁骑士

Unregistered / Unconfirmed
GUEST, unregistred user!
近来在工作中遇到一个很奇怪的问题,我做的程序是给电信局用来做记费信息的收集和统计
的。我的程序实时地接受客户端发来的电话记录并且将它插入数据库,我在其中用到了多线
程,当serversocket收到数据包时,将缓存的数据接受并且重新开一个存储区域储存它,同
时用一个stringlist记录这个存储区域的首地址和区域大小。而另外一个进程则是不断得查
询此stringlist是否有数据,一旦有数据则将stringlist中记录的这个存储区域的电话记录
分析并且插入数据库,插入数据库中后则释放此存储区域,我在其中用到了criticalsection
用来作stringlist的操作的同步,并且程序经常是需要进行大话务量操作,但是我的程序经
常是在正常得运行了几天后莫名其妙得自己关闭了,不知道是什么原因,谁能够帮我分析分
析?谢谢!
 
你跟我遇到的问题很相似啊,我也编写了个多线程服务器,有两种线程在运行,一种是serversocket的
服务线程接收数据并缓存,一种是定时器的线程负责处理上一种线程接收的数据。
问题就出现在定时器线程,它似乎不会释放线程资源,我是看着屏幕整整一天发现的,出问题时
会跳出大量的资源不足无法创建线程的系统错窗口,然后整个服务器程序自动关闭,不留痕迹。
我试过许多方法,都无法解决释放问题!
大家一起研究一下吧
 
是啊,我的问题跟你非常类似,你现在解决了这个问题吗?是怎样解决的?
 
你得自已想办法把关闭原因弄明白,是正常退出还是错误,出错的信息是什么。
否则没法(空想)。
建议你在程序中插入日志代码,把程序的所有动作记录下来,并每隔一小时观察
并记录程序的内存占用、CPU时间和线程数等。
 
用主线程接受响应,用副线程处理,线程用变量控制,
将并发转成线性处理
 
運行了几天后關閉﹐我想是你的內存方面處理有問題﹐即然如此﹐你可以用一個外殼程序
來調用你的程序。等一段時間后關閉你的程序﹐再等一會又打開﹐這樣子我想不會出錯了。
 
先用工具查一下是否有内存泄漏的情况
 
是线程出现异常照成程序退出,你必须在程序的线程加上线程异常处理 ,你可以用类似的方法
来处理线程内部的异常:
Quite often, this isn't the best solution and you will want to show the message to the end user, or allow your application to further process the message.
The easiest way todo
this, is to add an Exception object to your TThread class, and call the appropriate handler based on the type of exception. Here is an example of how todo
this. The project consists of one form with a Button placed on it:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TMyThread = class(TThread)
private
FException: Exception;
proceduredo
HandleException;
protected
procedure Execute;
override;
procedure HandleException;
virtual;
public
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TMyThread.DoHandleException;
begin
// Cancel the mouse capture
if GetCapture <> 0 then
SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
// Now actually show the exception
if FException is Exception then
Application.ShowException(FException)
else
SysUtils.ShowException(FException, nil);
end;

procedure TMyThread.Execute;
begin
FException := nil;
try
// raise an Exception
raise Exception.Create('I raised an exception');
except
HandleException;
end;
end;

procedure TMyThread.HandleException;
begin
// This function is virtual so you can override it
// and add your own functionality.
FException := Exception(ExceptObject);
try
//do
n't show EAbort messages
if not (FException is EAbort) then
Synchronize(DoHandleException);
finally
FException := nil;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
// Create an instance of the TMyThread
with TMyThread.Create(True)do
begin
FreeOnTerminate := True;
Resume;
end;
end;

end.

 
老兄:
我现在也正准备做一个数据采集器(电信的)和你得差不多,我还只做到点对点的传送
我想让服务器端支持多线程,发了帖子,没人理我,你能给我有关多线程的源代码和资料吗?
小弟先谢过了!
Email: honglueyihzg@sina.com
帮帮我吧!
 
如果在2000下出现非法操作,程序就会自动退出。
检查一下是否你的缓冲区溢出?
我以前弄个一个类似的程序,如果机器只是跑这个程序没有任何问题,但是当机器也跑其他
比较吃CPU的程序时就比较容易自动退出了。
我也是查了N久才发现这个问题啊!
 
一般而言,是线程里创建的对象没有被释放造成的,特别是使用定时器控件的时候要特别注意!
若在线程类的Create时生成定时器,在线程Destroy时释放,一般会出现比较大的问题,因为Tthread
的创建在主线程里,而Timer会自动生成一个窗口,所以此窗口在主线程里执行,当他接收到WM_TIMER
消息是在主线程,而生成的线程依赖于此消息,这样实际上整个应用程序在
两个线程里相互切换,而线程的调度是有Windows进行的,应用程序是不知道的,这样肯定会出现比较大
的问题. 线程的原则是窗口的过程代码必须由创建窗口的线程来执行.
若在线程中生成窗口,则系统会自动创建该线程的内存对象,建立消息循环,该线程就可以
通过消息进行通讯了,但要注意,窗口的生成过程必须在线程代码中.千万不要放在Tthread的
create过程中,因为他是在其他线程中调用的.
 
"生产者--消费者"问题 ! :)
(详见各操作系统教程)
 
翻翻旧帖子,为大富翁提速做点贡献!(政府都提速了,大富翁能不提速吗?)
 
别用delphi带的socket控件了,很烂,我去年吃尽了它的苦头
经常碰到程序自己关闭(实际是出现异常被操作系统强制关闭)
改用indy吧
 
是处理socket收到TCP包的时候收到断包,然后对断包的分析处理不当导致的。
谢谢各位
 
多人接受答案了。
 
后退
顶部