再问一下这个奇怪的问题?

秋天之落叶 2019-04-10 10:38:48
以下文件在dell台式机i5-4590+32位win7、联想笔记本i5-5200U+64win10、兼容台式机i5-750+64win10上运行,先显示登录界面、后显示主界面一切正常,仅仅是连续快速按登录按键时,会出现“对象打开时,不允许操作”的提示,我以为是多线程造成的。
但是,很奇怪的是,在刚刚购买的神州笔记本i5-8400+64位win10上运行,一样的代码,运行后竟然同时显示主窗体和登录窗体,也能输入和登录,登录后就正常了。这事我以前的帖子说过,但到现在都调试不好,除非调整项目文件先显示登录界面,登录成功后再隐藏登录界面,显示主界面。笔记本重新安装系统和应用,还是如此。
我怀疑是新的8代CPU的操作指令和以前不一样了,但也很是不明白,有没有了解的高手,给解惑一下。系统是10.3

//项目文件
program hyzx;

{ Reduce EXE size by disabling as much of RTTI as possible (delphi 2009/2010) }
{ $IF CompilerVersion >= 21.0 }
{ $WEAKLINKRTTI ON }
{ $RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([]) }
{ $IFEND }

uses
Forms,
windows,
main in 'main.pas' {Form1} ,
login in 'login.pas' {Form2} ,
dm in 'dm.pas' {DataModule1: TDataModule};

{$R *.res}

var
hAppMutex: THandle;

begin
hAppMutex := CreateMutex(nil, true, '管理系统');
if ((hAppMutex <> 0) and (GetLastError() <> ERROR_ALREADY_EXISTS)) then
begin
Application.Initialize;

Application.Title := '管理系统';
Application.MainFormOnTaskbar := false;

Application.ShowMainForm := true; //这里要是设置为false则运行程序不显示界面
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TDataModule1, Dm1);
Application.Run;
end
else
Application.MessageBox(pchar('综合管理系统 已经运行!'), pchar('提示!'), MB_OK);

ReleaseMutex(hAppMutex);
end.

----
//登录界面
procedure TForm1.FormShow(Sender: TObject);
begin
Form2.ShowModal;
end;

----
//登录确认
procedure TForm2.Button1登录Click(Sender: TObject);
begin
TMyThread.Create(False);
end;

----
//线程
procedure TMyThread.Execute;
......
核对登录信息
...全文
1372 89 打赏 收藏 转发到动态 举报
写回复
用AI写文章
89 条回复
切换为时间正序
请发表友善的回复…
发表回复
秋天之落叶 2019-04-25
  • 打赏
  • 举报
回复
引用 87 楼 早打大打打核战争 的回复:
应该不是硬件的问题
如果你对大神船有疑虑,可以用AIDA64做一下稳定性测试,CPU+FPU+CACHE,如果能稳定运行30分钟以上不失败就可以,这也是我用电脑的标准,不管是单位还是个人的,收机先来30分钟稳定性测试,不通过直接打回去,通过了一般连续开机5年没问题

AIDA64,默认选项4个,好像是整型,浮点FPU,缓存,显卡GPU,压力测试15分钟,CPU温度基本维持在91度,机器其他无异常。
不知道这个情况算不算稳定?
  • 打赏
  • 举报
回复
引用 89 楼 秋天之落叶 的回复:
[quote=引用 87 楼 早打大打打核战争 的回复:]
应该不是硬件的问题
如果你对大神船有疑虑,可以用AIDA64做一下稳定性测试,CPU+FPU+CACHE,如果能稳定运行30分钟以上不失败就可以,这也是我用电脑的标准,不管是单位还是个人的,收机先来30分钟稳定性测试,不通过直接打回去,通过了一般连续开机5年没问题

AIDA64,默认选项4个,好像是整型,浮点FPU,缓存,显卡GPU,压力测试15分钟,CPU温度基本维持在91度,机器其他无异常。
不知道这个情况算不算稳定?[/quote]

稳定,现代处理器降频温度基本在100度左右,加电情况下温度上限105度,不加电温度上限125度,以前陶瓷封装的CPU上限可以达到150度甚至更高(军标是-55到+165)

秋天之落叶 2019-04-24
  • 打赏
  • 举报
回复
引用 87 楼 早打大打打核战争 的回复:
应该不是硬件的问题
如果你对大神船有疑虑,可以用AIDA64做一下稳定性测试,CPU+FPU+CACHE,如果能稳定运行30分钟以上不失败就可以,这也是我用电脑的标准,不管是单位还是个人的,收机先来30分钟稳定性测试,不通过直接打回去,通过了一般连续开机5年没问题

OK,回头我试一试
秋天之落叶 2019-04-23
  • 打赏
  • 举报
回复
本帖结贴,但还请有知道的朋友赐教:为什么同一个代码生成的APP,在几乎所有的机子上都没有问题能正常稳定的运行,偏偏在神舟笔记本上(i5-8400)上运行报错。登录窗体.ShowModal不起作用,运行时主窗体和登录窗体先后同时显示出来?
百思不得其解!

神州笔记本,想说爱你并不容易啊!!!
  • 打赏
  • 举报
回复
应该不是硬件的问题
如果你对大神船有疑虑,可以用AIDA64做一下稳定性测试,CPU+FPU+CACHE,如果能稳定运行30分钟以上不失败就可以,这也是我用电脑的标准,不管是单位还是个人的,收机先来30分钟稳定性测试,不通过直接打回去,通过了一般连续开机5年没问题
秋天之落叶 2019-04-21
  • 打赏
  • 举报
回复
今天闲下来,测试了几个方法,感觉这个最简单了,几乎没有修改什么。
var
hAppMutex: THandle;
begin
hAppMutex := CreateMutex(nil, true, '管理系统');
if ((hAppMutex <> 0) and (GetLastError() <> ERROR_ALREADY_EXISTS)) then
begin
// Application.CreateForm(TDataModule1, DataModule1);
DataModule1 := TDataModule1.Create(Application);
Form2 := TForm2.Create(Application);
Form2.ShowModal;
if Form2.ModalResult = 1 then
begin
Application.Initialize;
Application.Title := '管理系统';
Application.MainFormOnTaskbar := false;
Application.ShowMainForm := true;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm转换角色, Form转换角色);
Application.CreateForm(TAboutBox, AboutBox);
Application.CreateForm(TForm3, Form3);
Application.Run;
end;
end
else
Application.MessageBox(pchar('后援服务中心综合管理系统 已经运行!'), pchar('提示!'), MB_OK);
ReleaseMutex(hAppMutex);
end.
不知道为什么,在笔记本上Form2 := TForm2.Create(Application)就要建在最上面,如果在楼上的坛友那个位置,总是调整不好,而且也不需要设置函数,直接引用登录窗口的返回值即可。只是数据模块上的所有登录引用均失效,要不屏蔽要不重建,总算调整完了。
经过测试,神船笔记本和其他机子上均通过。

感谢楼上所有的坛友的指点,这次真是深入地研究了一下窗口的建立,顺便复习了一下多线程的基础知识。

不会,一个错误逻辑,或者说代码不太规范的应用,在几乎所有的机子上都能正确运营,为什么偏偏在神船笔记本上不能正常运行?笔记本或多或少是和其他机子有点区别的,理论上在笔记本上创建的应用会更严谨,但这个现象照实的奇怪之极啊,还请知道的坛友答疑解决,不胜感激!
秋天之落叶 2019-04-20
  • 打赏
  • 举报
回复
引用 81 楼 BlueStorm 的回复:
报错的原因,明显就是在调用xtsj这个函数时,dm1还没生成。 你的问题应描述为:在主form的Onshow事件中ShowModal另一个Form,这两个form居然同时显示出来了,是不是? 那么我就建议你用隔离法找问题的原因。你新建一个非常非常非常简单的程序,只有两个form,在form1的OnShow事件中ShowModal Form2,编译后拷到到神州电脑上运行,看看有没有两个form同时显示出来的问题。 (1)如果没有同时显示出来,就添加你原有程序的代码,直到两个Form同时显示,这是你就应该知道时什么原因了。 (2)如果同时显示出来了,那基本上可以确定是电脑硬件或操作系统有问题
确实我急晕了,这么简单的逻辑没想到。测试了一下,最简单的窗口调用,在笔记本上没有问题,先显示2,关闭后显示1,看来确实是我的代码逻辑有问题。我准备彻底修改一下我的登陆代码。 但我搞不懂一点的是,错误的逻辑代码为什么在其它很多、几乎全部机子上就能正常运行,在笔记本上就不行?这一点太奇怪了。 多谢指点,也谢谢楼上几个坛友,我再继续研究研究。
BlueStorm 2019-04-20
  • 打赏
  • 举报
回复
报错的原因,明显就是在调用xtsj这个函数时,dm1还没生成。 你的问题应描述为:在主form的Onshow事件中ShowModal另一个Form,这两个form居然同时显示出来了,是不是? 那么我就建议你用隔离法找问题的原因。你新建一个非常非常非常简单的程序,只有两个form,在form1的OnShow事件中ShowModal Form2,编译后拷到到神州电脑上运行,看看有没有两个form同时显示出来的问题。 (1)如果没有同时显示出来,就添加你原有程序的代码,直到两个Form同时显示,这是你就应该知道时什么原因了。 (2)如果同时显示出来了,那基本上可以确定是电脑硬件或操作系统有问题
秋天之落叶 2019-04-20
  • 打赏
  • 举报
回复
比较了一下,指令集确实不一样:
i5 750:MMX,SSE,SSE2,SSE3,SSSE3,SSE4.1,SSE4.2
i5 8400:SSE4.1/4.2,AVX2
i7 8700:SSE4.1/4.2,AVX2,64bit
我对比了一下,i345三代以后的CPU基本上都带64bit,唯独i5 8400不带64bit,难道8400不支持64位操作系统?安装的是假的64位系统?难道就因为差了一个64bit?不可思议。
nongen 2019-04-20
  • 打赏
  • 举报
回复
01 年的时候,遇到个问题,一台联想的品牌机,客户那边买回去用了一段时间,没有问题,直到突然有一天,用的Excel 宏功能,,然后崩溃,,,,而不使用Excel的宏(Word什么的,没有问题),然后送去维修站,维修站一堆的工程师也懵,系统重装N次,不管是祼装还是Ghost,都这样。然后只能用最原始的办法,换硬件测试。。。直到CPU被换了,,然后好了。
BlueStorm 2019-04-19
  • 打赏
  • 举报
回复
那是不是在OnActivate事件前,主form就显示出来了?
秋天之落叶 2019-04-19
  • 打赏
  • 举报
回复
读写错误是这个获取系统时间的函数,把其屏蔽掉,直接赋值,不再提示读写错误,但是,运行后还是两个窗体同时显示。 我也把软件传给了神舟的客服,也按照他给的方法重装系统,结果还是这样,这货也傻眼了,我也服气了。 还有其他什么线索? // 获取服务器的时间 function TForm1.xtsj: TDateTime; begin // dm1.ADOQuery1.Close; // dm1.ADOQuery1.SQL.Clear; // dm1.ADOQuery1.SQL.Add('select getdate() as 时间'); // dm1.ADOQuery1.Open; // Result := dm1.ADOQuery1.FieldByName('时间').AsDateTime; Result := Today(); end;
  • 打赏
  • 举报
回复
DefaultMonitor默认应该都是dmActiveForm
秋天之落叶 2019-04-19
  • 打赏
  • 举报
回复
目前我一直认为不是代码的原因,因为这套代码在其他任何机子上都没问题,唯独在神船笔记本上报错并显示双窗体,而且神船的系统家庭版和专业版都报错,这肯定是笔记本有问题,但我现有的知识不足以判断。还请电脑高手关注、解惑。
秋天之落叶 2019-04-19
  • 打赏
  • 举报
回复
引用 63 楼 BlueStorm 的回复:
1. 我看你的主form是一个 MDIForm,你看一下Login的Form是不是不小心设成MDI Child了

2.主form的生成过程是:OnCreate->OnShow->OnActivate
你看一下OnActivate事件是什么时候出现的:
procedure TForm1.FormActivate(Sender: TObject);
begin
ShowMessage('OnActivate');
end;

form1:

form2:

onactivate:登录窗口关闭,主窗口打开时出现提示,时间里面操作是给全局变量赋值、调出首页画面、静态显示条显示姓名岗位等。
BlueStorm 2019-04-19
  • 打赏
  • 举报
回复
1. 我看你的主form是一个 MDIForm,你看一下Login的Form是不是不小心设成MDI Child了 2.主form的生成过程是:OnCreate->OnShow->OnActivate 你看一下OnActivate事件是什么时候出现的: procedure TForm1.FormActivate(Sender: TObject); begin ShowMessage('OnActivate'); end;
秋天之落叶 2019-04-19
  • 打赏
  • 举报
回复
引用 78 楼 早打大打打核战争 的回复:
显然是这个"显示读写错误"造成的,这个读写错误应该是在主form,也就是你的form1中的某些调用导致的,然后它弹出对话框,就把form1显示出来了,你只要把这个错误清除掉就好了

我看了该盘符的文件属性,是正常的读写权限,换个盘符也是如此。
还有哪方面会影响异常?
  • 打赏
  • 举报
回复
引用 74 楼 秋天之落叶 的回复:
[quote=引用 73 楼 BlueStorm 的回复:]
登录窗口关闭-主窗体显示-消息框显示 --- 登录窗口关闭前,主窗体不显示出来,那不就是想要显示顺序码?

是的。
我想要的结果,显示登录窗体-录入账号密码正确,关闭登录窗体-显示主窗体。
目前代码在任何机子上都没问题,就是在神船笔记本上是这样的:运行-显示读写错误,确认继续-显示主窗体-顿一下-同时显示登录窗体-登录正确-登录关闭,主窗体依旧显示。神船已经测试了家庭版和专业版,均提示如上错误。[/quote]

显然是这个"显示读写错误"造成的,这个读写错误应该是在主form,也就是你的form1中的某些调用导致的,然后它弹出对话框,就把form1显示出来了,你只要把这个错误清除掉就好了
秋天之落叶 2019-04-19
  • 打赏
  • 举报
回复
引用 76 楼 BlueStorm 的回复:
那你就写一个能重复出这个错误的最简单的程序,在debug模式下,看看是那个语句报错。

我现在奇怪的是,为什么其他机子上没问题,不报错也运行正常,而神舟笔记本上就报错并同时显示两个窗体?
CPU?显卡?系统版本?还是别的其他说明设置?
我想搞明白。
BlueStorm 2019-04-19
  • 打赏
  • 举报
回复
那你就写一个能重复出这个错误的最简单的程序,在debug模式下,看看是那个语句报错。
加载更多回复(69)

16,748

社区成员

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

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