Lazarus中文社区

 找回密码
 立即注册(注册审核可向QQ群索取)

QQ登录

只需一步,快速开始

Lazarus IDE and 组件 下载地址版权申明
12
返回列表 发新帖
楼主: tjcfeng

很奇怪的问题,请教大家

[复制链接]

该用户从未签到

发表于 2009-10-20 09:30:17 | 显示全部楼层
引用第8楼tjcfeng于2009-10-19 10:44发表的  :
源代码?
新建工程的源代码不是都一样吗?

“只是单纯的新建一个工程、编译,然后拷到手机上”
新建工程由几个选项你选的哪一个?不过,你说的问题我在WINCE5.0的GPS上没遇到过。
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2009-10-20 09:32:17 | 显示全部楼层
非常感谢 下渔舟  ,我去看看这个消息。

不过我很奇怪这些应该是编译器自动来处理的,看来Lazarus 还是不完善啊。

昨天又把系统刷成6.5的,上述的操作对程序好象影响不大,可是运行占CPU比较高的程序时还是会导致本程序退出,看来问题还是一样的。
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2009-10-20 09:49:11 | 显示全部楼层
重新写代码做了一下实验,发现问题更奇怪了。
代码:
  1. program Test;
  2. uses Windows;
  3. var MSG: TMSG; EventHandle, ThreadHandle: Handle;
  4. function Thread(Param: Pointer): Longint;
  5. begin
  6.   while True do
  7.   begin
  8.       WaitForSingleObject(EventHandle, 10000);
  9.   end;
  10. end;
  11. begin
  12.   EventHandle:= CreateEvent(nil, False, False, nil);
  13.   ThreadHandle:= [color=#FF0000]BeginThread(@Thread); [/color]
  14.   while (GetMessage(MSG, nil, 0, 0))
  15.     {
  16.         TranslateMessage(MSG);
  17.         DispatchMessage(MSG);
  18.     }
  19. end;
复制代码

这样写的程序运行完全正常,不管怎样操作,都不会造成影响。

然而改成这样就不行了:
代码:
  1. program Test;
  2. uses Windows;
  3. var MSG: TMSG; EventHandle, ThreadHandle: Handle; ThreadID: DWORD;
  4. function Thread(Param: Pointer): Longint;
  5. begin
  6.   while True do
  7.   begin
  8.       WaitForSingleObject(EventHandle, 10000);
  9.   end;
  10. end;
  11. begin
  12.   EventHandle:= CreateEvent(nil, False, False, nil);
  13.   ThreadHandle:= [color=#FF0000]CreateThread(nil, 0, @Thread, nil, 0, ThreadID); [/color]
  14.   while (GetMessage(MSG, nil, 0, 0))
  15.     {
  16.         TranslateMessage(MSG);
  17.         DispatchMessage(MSG);
  18.     }
  19. end;
复制代码

这样是不行的,或者改成这样:

代码:
  1. program Test;
  2. uses Windows;
  3. var MSG: TMSG; EventHandle, ThreadHandle: Handle;
  4. function Thread(Param: Pointer): Longint;
  5. begin
  6.   while True do
  7.   begin
  8.       WaitForSingleObject(EventHandle, 10000);
  9.   end;
  10. end;
  11. [color=#FF0000]procedure StartThread;
  12. begin
  13.   ThreadHandle:= BeginThread(@Thread);
  14. end; [/color]
  15. begin
  16.   EventHandle:= CreateEvent(nil, False, False, nil);
  17.   [color=#FF0000]StartThread; [/color]
  18.   while (GetMessage(MSG, nil, 0, 0))
  19.     {
  20.         TranslateMessage(MSG);
  21.         DispatchMessage(MSG);
  22.     }
  23. end;
复制代码

这样也是不行的,也就是说Lazarus是不能用来做项目的,白浪费了我的时间。

我测试的手机配置:CPU: K3 360MHz,Memory 128M

另外,这三段程序不是直接从程序中拷过来的(在家了,没带来),临时写在帖子上的,只为表达清楚含义或用法,所以有可能有格式上或拼写上的错误,请不要认为实际的程序也是这样(肯定编译不过去)。
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2009-10-20 09:52:18 | 显示全部楼层
楼上,帮你把回复的代码内容改为了内容格式,这样可以让大家看得更清楚。
私自改动你的回复,请不要介意
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2009-10-20 10:08:51 | 显示全部楼层
引用第12楼tjcfeng于2009-10-20 09:49发表的  :
重新写代码做了一下实验,发现问题更奇怪了。
代码:

.......
Lazarus通过创建Appplication对象来传递消息,所以一定要引入Forms单元,加入Application.Initialize;才能使用很多标准的对象如线程和form对象等。另外WaitForSingleObject正确用法是
  1.   repeat
  2.     ret := WaitForSingleObject(ObjectHandlerID, 500);
  3.     Application.ProcessMessages;
  4.   until ret <> WAIT_TIMEOUT;
复制代码
否则会造成其它事件不能处理。
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2009-10-20 13:59:49 | 显示全部楼层
引用第13楼猫工于2009-10-20 09:52发表的  :
楼上,帮你把回复的代码内容改为了内容格式,这样可以让大家看得更清楚。
私自改动你的回复,请不要介意


呵呵,当然不介意,改完好看多了,我不知道怎样改,谢谢。
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2009-10-20 14:08:17 | 显示全部楼层
引用第14楼damcool于2009-10-20 10:08发表的  :

Lazarus通过创建Appplication对象来传递消息,所以一定要引入Forms单元,加入Application.Initialize;才能使用很多标准的对象如线程和form对象等。另外WaitForSingleObject正确用法是
[code]
  repeat
    ret := WaitForSingleObject(ObjectHandlerID, 500);
.......


非常感谢你的回复,不过我觉得不是问题所在。

用标准的API编写程序时难道非得引用Forms单元?这样程序一下子增加1M,那就没有意义了。

上个帖子我已经说的很清楚了,哪样可以运行,哪样不可以运行。第一段代码不创建Form也会很正常运行的,可能你没有用纯API写过程序吧?或者是我不知道Lazarus不支持纯API程序?

至于WaitForXXX的用法,我也已经说的很清楚,这几段代码只为了说明道理,真正要用的时候肯定会判断返回值做处理的。
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2009-10-20 14:15:01 | 显示全部楼层
可能我没有表达清楚,上面几段代码是为了说明
BeginThread、CreateThread和过程调用的差异,不要过分的注重代码的格式,网上所有的程序对我来说都是伪代码,都会改造后再使用的,思路更重要。
回复 支持 反对

使用道具 举报

*滑块验证:

本版积分规则

QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1 )

GMT+8, 2025-5-2 22:44 , Processed in 0.026953 second(s), 8 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表