线程操作Excel时的问题,高分,不够另开贴,问题可能的确不容易,找了很多资料都没有找到。

wanderung 2004-12-21 01:57:29
因为通过数据库的形式读取Excel文件需要定义该文件,而由此不灵活同时达不到要求。所以采取读取文件的方法。

以线程方式读取Excel文件,则出现如下问题:线程终止出现错误!描述如下

ExcelApplication1: TExcelApplication;
ExcelWorkbook1: TExcelWorkbook;
ExcelWorksheet1: TExcelWorksheet;

在线程中创建对象
ExcelApplication1 := TExcelApplication.Create(application);
ExcelWorkbook1 := TExcelWorkbook.Create(application);
ExcelWorksheet1 := TExcelWorksheet.Create(application);
ExcelApplication1.Connect;
ExcelApplication1.Visible[0] := false;
ExcelWorkbook1.ConnectTo(
ExcelApplication1.Workbooks.Open(
'c:\a.xls', EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam, 0));
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.ActiveSheet as _WorkSheet);

具体读取文件中的内容没问题,以下代码完成读取结束退出Excel。
ExcelApplication1.Quit;
ExcelWorksheet1.Disconnect;
ExcelWorkbook1.Disconnect;
ExcelApplication1.Disconnect;

问题在于在线程正在执行的过程中,用户要取消,就会出现问题。采用
trd1.Suspend;
trd1.Terminate;
结束线程程序运行倒没有出错,然后查看系统进程的时候Excel依然存在,这样打开Excel程序就会有问题(很显然)。而在后面加上trd1.Free;程序就死锁,不知道为什么?

这里尝试过线程对象override
constructor Create(cid: string);
destructor Destroy; override;
其中在Create中创建Excel的对象,在Destroy中关闭、Free对象。程序会出错。

其中有一个错误是:“应用程序调用一个已为另一线程整理的界面”。对这个错误到google搜索,也没有找到什么有用的。

而且问题不仅如此,如果线程正在运行的过程中,操作Excel程序都会导致程序线程停止(并非挂起),实在是令人气急!

这里也想过不用线程的方式,但是很多记录的时候,读取,界面就跟死了一样,用户那里肯定通不过。各位有何高见,有能够解决这个问题定高分相谢!
...全文
272 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kshape 2004-12-27
  • 打赏
  • 举报
回复
我新来的,
只能帮你顶一下!!
asmgirl 2004-12-27
  • 打赏
  • 举报
回复
gz
wanderung 2004-12-23
  • 打赏
  • 举报
回复
up
wanderung 2004-12-22
  • 打赏
  • 举报
回复
>>不要挂起線程, 而是在操作中, 加一個判斷if Terminated then, 判斷是否用戶要中止, 然後自己操>>作退出, 但這樣, 會在處理代碼中加入很多判斷的語句, 一般在進入操作時間比較長的時候判斷, 如>>你用一個 for 循環, 就可以不斷的判斷
>>這樣做的目的, 就是在退出時, 不要挂起 excel的線程

这个主意非常不错,第一个问题解决了。

可是关于线程执行过程中若操作Excel,线程则非正常挂起,这个还不知道是什么原因??
aiirii(ari-爱的眼睛)说不connect,可不connect怎么读取excel文件,如何创建excel服务器呢??
继续求助!
zsp0010 2004-12-22
  • 打赏
  • 举报
回复
我新来的,
只能帮你顶一下!!
wanderung 2004-12-22
  • 打赏
  • 举报
回复
up一下
wanderung 2004-12-22
  • 打赏
  • 举报
回复
顶一下,没人关注了嘛

莫非要重新开贴?呵呵
wanderung 2004-12-21
  • 打赏
  • 举报
回复
To: aiirii(ari-爱的眼睛)

>>如果线程正在运行的过程中,操作Excel程序都会导致程序线程停止
一般不要選擇 connect, 而是新建一個 excel的服務器(大概這樣表達吧)

不知道这里excel服务器怎么建立呢?
wanderung 2004-12-21
  • 打赏
  • 举报
回复
这里本来我也是用nil的,可后来想是不是拥有者为application就结束Excel。

多谢aiirii(ari-爱的眼睛),我先试试,看能不能行
aiirii 2004-12-21
  • 打赏
  • 举报
回复
>>Create(application);
如果在在線程中, 我覺得用 Create(nil); 更好
aiirii 2004-12-21
  • 打赏
  • 举报
回复
我以前做過類似的, 也花了不少時間解決類似你的問題, 提几個建議:

>>问题在于在线程正在执行的过程中,用户要取消,就会出现问题。采用
>> trd1.Suspend;
>> trd1.Terminate;

不要挂起線程, 而是在操作中, 加一個判斷if Terminated then, 判斷是否用戶要中止, 然後自己操作退出, 但這樣, 會在處理代碼中加入很多判斷的語句, 一般在進入操作時間比較長的時候判斷, 如你用一個 for 循環, 就可以不斷的判斷
這樣做的目的, 就是在退出時, 不要挂起 excel的線程

>>如果线程正在运行的过程中,操作Excel程序都会导致程序线程停止
一般不要選擇 connect, 而是新建一個 excel的服務器(大概這樣表達吧)


wfhlxl 2004-12-21
  • 打赏
  • 举报
回复
这样还是有问题的,即便能够终止线程,但是如果在线程执行过程中操作Excel的问题依然存在
问题 is 程序就死锁 ?
纯冰糖 2004-12-21
  • 打赏
  • 举报
回复
还是写成两个线程分别处理一些事务
wanderung 2004-12-21
  • 打赏
  • 举报
回复
这样还是有问题的,即便能够终止线程,但是如果在线程执行过程中操作Excel的问题依然存在
wfhlxl 2004-12-21
  • 打赏
  • 举报
回复
you write a tcommponent pack the tthread. define a public method for terminated thread.
in the method termined the you want termined excel progress use win 32 api terminiteprocess or uses sendmessage(excelmainhwnd,wm_syscommand,sc_close,0);
wanderung 2004-12-21
  • 打赏
  • 举报
回复
楼上老兄,求你帮个忙了
我在大富翁也是找了后才来问的
bee2518 2004-12-21
  • 打赏
  • 举报
回复
大富翁上经常有类似错误,都是线程处理不当造成
把读,写分成两个线程来做,用多线程来解决
具体你上大富翁查查过去的帖子
yichuan1982 2004-12-21
  • 打赏
  • 举报
回复
有时候,我都真想直接去商场门口发传单,举牌子了
请一定帮忙,谢谢!
请看看:


http://community.csdn.net/Expert/topic/3663/3663763.xml?temp=.569195
befree 2004-12-21
  • 打赏
  • 举报
回复
excel application级的不好控制

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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