Midas三层结构,客户端经常死锁,请高手帮忙

yhloveys yhloveys 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
结构:Client(SocketConnection) + Server(RemoteDataModule ) + DataBase(sql server 2000)

Server上维护一些测量程序名,以及对应的点位,和一些测量参数
Client上对测量仪器所测量的测量数据时实监控,用的是一个多线程.
每次获取到数据文件,都会通过ClientDataSet传递到Server端.然后在Server端进行点位比对,数据检验,添加合格标志.
再把这些信息通过OleVariant返回到Client.
Client的数量有16

现在遇到的问题就是Client在使用过程中,经常无缘无故的死掉,而且重新登陆连接还是无法连接到Server.
我有打开scktsrvr.exe查看用户数,上面会有同一个用户的多个连接在上面,所以导致该用户无法再连接,只有把scktsrvr.exe重新启动以后,又没有问题,可以用几个小时,过后又是这样.


下面是我Server上RemoteDataModule中的两个函数
function TQPDMRDM.CheckAllAvriable(List: OleVariant;
const prg_name: WideString): WideString;
var
// a : Tdata;
str_sql: String;
variable_name ,addflag: String;

temp_str : String;
begin
temp_str := '';

str_sql := 'SELECT * FROM v_variable WHERE FOLDER_NAME='''+ trim(prg_name)+'''';
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add(str_sql);
adoquery1.Open;

ClientDataSet1.Data := List;


if adoquery1.RecordCount > 0 then
begin
adoquery1.First;
while not adoquery1.Eof do
begin
variable_name :=trim(adoquery1.fieldbyname('variable_name').AsString);
if not ClientDataSet1.Locate('variable_name',variable_name,[]) then
begin//用比这更优的比对方法吗??
if temp_str <> '' then
temp_str := temp_str + ',';
temp_str := temp_str + variable_name;
end;
adoquery1.Next;
end;
end;
ClientDataSet1.EmptyDataSet;
adoquery1.Close;
Result := temp_str;
end;



function TQPDMRDM.InsertAll(Ole_DataSet: OleVariant; const prg_name,
computername: WideString): OleVariant;
var
addflag :String;
D_value : Double;
s_Variable,S_datetime : String;
ok_flag : Integer;
begin
try
try
cds_temp.CreateDataSet;

ClientDataSet1.Data := Ole_DataSet;
try
// frm_main.mainconn.BeginTrans; //开始事务处理
ClientDataSet1.First;
while not ClientDataSet1.Eof do
begin
D_value := strTOFloat(ClientDataSet1.FieldValues['value']);
S_Variable := ClientDataSet1.FieldValues['variable_name'];
S_datetime := ClientDataSet1.FieldValues['date_time'];

try
addflag := TFunc.addFlag(D_value,prg_name,S_Variable);
except
addflag := '' ;
end;

ok_flag:=self.checkfields(prg_name,S_variable,floatTOstr(D_value));
case ok_flag of
0:
begin
end;
1: //合格数据
begin
saveInspData(S_datetime,floatTOstr(D_value),trim(computerName),trim(addflag));

cds_temp.Append;
cds_temp.FieldByName('variable_name').AsString := S_Variable;
cds_temp.FieldByName('value').AsString := floatTOstr(D_value);
cds_temp.FieldByName('date_time').AsString := S_datetime;
cds_temp.FieldByName('flag').AsBoolean :=true ;
cds_temp.FieldByName('addflag').AsString := addflag;
cds_temp.FieldByName('usl_value').AsString := floatTOstr(usl_value1);
cds_temp.FieldByName('target_value').AsString := floatTOstr(target_value1);
cds_temp.FieldByName('lsl_value').AsString := floatTOstr(lsl_value1);
cds_temp.Post;
end;
2: //不合格数据
begin
saveNoInspData(S_datetime,floatTOstr(D_value),trim(computerName),trim(addflag));

cds_temp.Append;
cds_temp.FieldByName('variable_name').AsString := S_Variable;
cds_temp.FieldByName('value').AsString := floatTOstr(D_value);
cds_temp.FieldByName('date_time').AsString := S_datetime;
cds_temp.FieldByName('flag').AsBoolean :=false ;
cds_temp.FieldByName('addflag').AsString := addflag;
cds_temp.FieldByName('usl_value').AsString := floatTOstr(usl_value1);
cds_temp.FieldByName('target_value').AsString :=floatTOstr(target_value1);
cds_temp.FieldByName('lsl_value').AsString := floatTOstr(lsl_value1);
cds_temp.Post;
end;
end;
ClientDataSet1.Next;
end;
// frm_main.mainconn.CommitTrans; //提交事务
ClientDataSet1.EmptyDataSet;
result := cds_temp.Data;
except
on e:Exception do
begin
// frm_main.mainconn.RollbackTrans;//当有错误时,回滚事务
ClientDataSet1.EmptyDataSet;
cds_temp.EmptyDataSet;
frm_main.memo_System.Lines.Add(formatdatetime('yyyy-mm-dd hh:nn:ss ',now)+e.Message);
end;
end;
finally
cds_temp.EmptyDataSet;
end;
except
on e:Exception do
begin
frm_main.memo_System.Lines.Add(formatdatetime('yyyy-mm-dd hh:nn:ss ',now)+e.Message);
cds_temp.EmptyDataSet;
end;
end;


下面是Client上多线程中调用Server的一个函数部份代码:
m_ah.ShowMsg('开始到服务器上检测variable 的完整性',1);
try
miss_String:=ClientDM.scktconn.AppServer.CheckAllAvriable(ClientDM.ClientDataSet3.Data,str_pro); //调用服务器上的函数
except
on e:Exception do
m_ah.ShowMsg('到服务器上检查variable出错:'+e.Message);
end;
m_ah.ShowMsg('完整性检查结束',1);
if miss_String <> '' then
begin
tag1 := 'Miss Data';
m_ah.ShowMsg('variabel不完整,缺少:'+miss_string+'开始打开缺少variable界面',1);
pro_name := trim(str_pro);
miss_tag := true;
// SendMessage(frm_main.Handle,WM_USER + 2, 5, 0); //打开missForm窗口,线程不停止
end
else
begin
tag1 := 'NO Miss';
pro_name := trim(str_pro);
TRY
m_ah.ShowMsg('开始到服务器上插入数据,',1);
frm_main.cdsBase.Data := ClientDM.scktconn.AppServer.InsertAll(ClientDM.ClientDataSet3.Data,str_pro,computerName);//调用Server上的函数
m_ah.ShowMsg('插入数据到服务器成功',1);
frm_main.Edit1.Text := trim(str_pro);
EXCEPT
on e:exception do
begin
m_ah.ShowMsg('插入数据到服务器上出错:'+e.Message);
frm_main.Edit1.Text := '';
frm_main.cdsBase.EmptyDataSet;
end;
end;
end;
end;
end;


请高手帮忙看看,到底哪里有问题了
...全文

相关推荐

技术转移机构如何基于数据提升项目撮合精准度?.docx

技术转移机构如何基于数据提升项目撮合精准度?

BIZKEEN

超扭滑模与快速终端滑模的永磁同步电机无感控制:理论、离散化实现与仿真研究(Simulink仿真实现)

内容概要:本文系统研究了超扭滑模控制(STSMC)与快速终端滑模控制(FTSMC)在永磁同步电机(PMSM)无感控制中的应用,重点涵盖其理论基础、离散化实现方法及Simulink仿真验证。文章深入阐述了两种高阶滑模控制策略的设计原理,利用磁链无感观测技术实现转子位置与速度的精确估计,从而省去物理传感器,有效提升了系统的可靠性与鲁棒性。同时,提供了完整的Simulink仿真模型构建方案,包括控制器设计、关键参数整定及动态响应性能分析,充分验证了所提出的方法在零速与低速工况下的卓越控制性能和有效性。; 适合人群:具备电机控制、现代控制理论基础知识及熟练掌握MATLAB/Simulink仿真技能的研究生、科研人员与工程技术人员。; 使用场景及目标:①深入理解高阶滑模控制在电机驱动系统中的设计思想与具体实现;②掌握基于滑模观测器的无感控制核心技术;③开展永磁同步电机高性能控制算法的理论研究、仿真验证与工程化探索。; 阅读建议:建议将文中详尽的理论推导与Simulink仿真模型相结合进行学习,重点关注滑模面的构建、抖振抑制策略的实施以及离散化处理的细节,有条件的研究者可进一步将算法移植到DSP等硬件平台进行实验验证,以深化对理论的理解并检验其实际应用效果。

长安程序猿

多源动态最优潮流的分布鲁棒优化方法(IEEE118节点)(Matlab代码实现)

内容概要:本文系统阐述了基于Matlab的多源动态最优潮流分布鲁棒优化方法,聚焦于IEEE118节点电力系统,旨在应对高比例可再生能源接入背景下源荷双重不确定性所带来的调度挑战。该方法深度融合分布鲁棒优化理论,通过构建能够抵御最坏情况概率分布的决策模型,有效提升了电力系统在复杂不确定性环境下的运行安全性、经济性与可靠性。研究不仅提供了完整的Matlab代码实现,便于结果复现与算法验证,还特别关注了含风电等新能源的现代电网低碳调度问题,为解决实际工程中的优化调度难题提供了强有力的理论支撑和技术工具。; 适合人群:具备电力系统分析基础和Matlab编程能力的研究生、科研人员及从事智能电网优化运行、能源系统规划等相关领域的工程技术人员。; 使用场景及目标:①研究含高比例可再生能源接入的电力系统动态最优潮流问题;②掌握分布鲁棒优化在电力系统经济调度、低碳调度中的建模思想与求解方法;③利用IEEE118标准测试系统进行算法有效性验证与性能对比分析;④基于所提供的Matlab代码进行二次开发,探索新型不确定性优化理论在电力系统中的创新应用。; 阅读建议:建议读者结合电力系统最优潮流、不确定性优化理论(特别是分布鲁棒优化)的背景知识进行学习,重点关注模型的构建逻辑、目标函数与约束条件的设计原理,以及Matlab代码的具体实现细节。在学习过程中,应动手调试代码,尝试修改系统参数(如新能源出力波动范围、负荷水平等),以观察不同场景下优化结果的变化,从而深刻理解该方法的适应性、优势及其潜在的局限性。

天天程序猿

车间调度基于GA、PSO、SA、ACO、TS优化算法的车间调度比较研究(Matlab代码实现)

内容概要:本文系统性地比较了遗传算法(GA)、粒子群优化(PSO)、模拟退火(SA)、蚁群优化(ACO)和禁忌搜索(TS)五种智能优化算法在车间调度问题中的性能表现,并提供了基于Matlab的完整代码实现。研究聚焦于调度优化的核心目标——最小化完工时间(makespan),通过标准测试案例对各算法的收敛速度、求解精度和稳定性进行了深入对比分析,旨在为实际生产调度中算法的选择与改进提供科学依据。文中不仅详述了每种算法的设计思路与关键参数设置,还展示了其实现逻辑,便于读者理解、复现与拓展。; 适合人群:从事智能制造、工业工程、运筹优化等相关领域的研究人员,以及具备Matlab编程基础、希望将智能优化算法应用于实际调度问题的研究生和工程师。; 使用场景及目标:① 掌握主流智能优化算法在解决NP-hard车间调度问题上的具体应用与差异;② 学习如何利用Matlab实现并对比不同优化算法的性能;③ 为解决生产制造、物流配送等领域中的资源调度难题提供算法选型和技术参考。; 阅读建议:建议读者在阅读时重点关注各算法的Matlab实现代码和实验结果对比部分,动手运行代码以直观感受不同算法的寻优过程和效果差异。同时,可结合具体调度约束条件,尝试调整算法参数或融合多种算法思想,以深化对优化机理的理解。

天天程序猿

3D人物伍子胥智能对话及反应动作报告

3D人物伍子胥智能对话及反应动作报告

atye115
评论 10
收藏 已收藏
分享
返回顶部