QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 4637|回复: 10
收起左侧

[已解决] 如何判断plottofile方法运行结束?

[复制链接]
发表于 2009-10-26 11:31:40 | 显示全部楼层 |阅读模式 来自: 中国天津

马上注册,结识高手,享用更多资源,轻松玩转三维网社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了( v4 s  E, J& b+ S3 P' K& Y

: s4 \. O0 u/ B( o在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。
# G' N; Y% ], |; e# Z* \( H
  s3 u3 ^, L" U. m但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。: J5 E$ V7 i7 s  S! Y! M
5 o. G6 b- \, o" G3 t8 D* A
这就是说plttofile方法是还没有运行完。
9 k0 f2 e) P2 ^; R  k! h; b8 t$ j2 ^& p8 B+ [' H% I/ H
问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?
1 ?, e# E2 D0 l, R* k# M* ^0 J5 v4 w
[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:9 I9 R: Q, {. Z0 Q+ F& o; |5 K9 x
Private Sub Command1_Click()# V- f  Q" ^3 X$ V  e2 r
     'plottofile方法
2 l9 X0 }  a  {     Unload Form1$ T+ L# F8 S4 V4 a
End Sub8 ?/ i. H. Q3 b9 Z* G& h, s
Private Sub Form_Unload(Cancel As Integer)
) x8 |# R* R! b1 _2 t     '此处写入需要运行的方法' `- j6 _  [4 U) `9 k& {
End Sub
% @8 K: R% q2 Z( W: \8 V; ?3 u% H7 r4 N
从运行过程看应该可以,明天去单位试一下
发表于 2009-10-27 06:43:52 | 显示全部楼层 来自: 中国

回复 2# 157787698 的帖子

检查指定的文档是否存在或许会更好一点?
 楼主| 发表于 2009-10-27 08:37:12 | 显示全部楼层 来自: 中国天津
原帖由 woaishuijia 于 2009-10-27 06:43 发表 http://www.3dportal.cn/discuz/images/common/back.gif/ \% b7 G. Q# x4 n, T; D
检查指定的文档是否存在或许会更好一点?

4 m2 Y3 N+ {: B
4 c# @7 j6 W/ Q$ f8 Y, u: e) D9 z( U0 X# N3 ?' c

+ r1 J4 c: v+ C$ ?文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开2 z: _1 B$ O* m: z: r, s) J

! Y% I- x$ ~& @0 o" s程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)  b2 O( ]9 L5 n7 Z# q
) p5 V# y1 e% N* I' u" i8 N* m
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式) s0 w+ }% H  l* z4 i* Z! r
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)9 b: M  U; t% O+ H- A5 j0 B3 W3 C

5 Z4 V3 g8 E& \' v: J8 J" l RetVal11 = 1                                                                      '关闭PlotToFile输出的文档
" k  h2 n6 a- J5 x    Do While RetVal11 <> 0
, E8 Z- F$ v. h6 V, a+ q# Q      winHwnd11 = FindWindow(vbNullString, drawname11)
) W9 q7 E/ Q# T. [/ t        If winHwnd11 <> 0 Then9 T- O) j* C, w, n# K* {
           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&); C; @5 A8 Z/ n# W9 i; L5 N
           RetVal11 = 00 l4 \2 k" v2 n. d; r
        End If
) g8 s6 ^7 K; _/ s  n    Loop% l3 K1 L4 R# X/ C) H
RetVal12 = 1
0 y& W& \& L. I# a    Do While RetVal12 <> 0
  J3 C" O0 ^# J* x: @  s* W# h      winHwnd12 = FindWindow(vbNullString, drawname12)# B- K7 l9 ^% W
        If winHwnd12 <> 0 Then
& B+ l/ U2 G# p+ t           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)
6 M5 p8 O1 Z/ S           RetVal12 = 0! ~8 T5 s, M9 H) ]6 u
        End If
) i1 n/ Z8 O* V# p; ?; o1 I4 q" `    Loop2 M: ?0 C5 E1 h" X) h

1 U7 [0 {/ J# d+ _" G% t! C7 u   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档
2 l) J" E7 ^* P7 @2 ^. L9 \) z' W    Set M2 = New MODI.Document& N, o+ ?7 m8 Q" C5 m, O, _
    Set M5 = New MODI.Document3 \. v4 K5 e) a) }2 x$ X6 F
    ) Q( n" r6 G* p
    M1.Create pathmdi11
" e7 S( v6 l) Q; i- m/ R    M2.Create pathmdi12
5 ^" g& i) _9 c3 ]5 B    M5.Create, Z$ Q* R' x4 m
    M5.Images.Add M2.Images(0), Nothing
& V* e8 y9 }0 Z2 Q# f+ t; H( ~" h    M5.Images.Add M1.Images(0), Nothing( d( z* t$ \2 ?- E5 I' `$ c; V
    M5.SaveAs pathmdi
% }0 a9 ?6 x5 K% {    M1.Close$ [, J; B/ A5 E# G
    M2.Close% E4 i3 ]4 t: M1 M- S6 R! |
    M5.Close
' D4 H+ e( ^; h! L( r, N    Kill pathmdi11                                      '删除PlotToFile输出的两个文档
6 H' y$ B% o! V3 Y; p9 D2 u5 I4 l    Kill pathmdi123 `* V0 m; l# Z# F! x1 z
8 H  N; y% f7 i, v0 Q! x
    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档
; s3 @" X( v5 b# {; l$ q$ D
$ f- S  K  [2 v% U: ~  N+ s2 u1 I+ D5 m3 \# c0 \9 Z
程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档7 D2 u" C, @; Q

1 J) p. t/ q9 J" d# t) }1 ~( k6 l但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:
: G+ M) y0 @2 {0 t! h1、程序死掉,需要关闭ACAD;$ X' l3 N: N) g& Z# a
2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;0 W8 U- ?) z' v$ j. ]1 b% L$ a
3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。
* _3 t# L- K& W1 T2 {2 \* D/ v7 N/ O+ ~
现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的
5 `9 c  p( D  p) Y- c. W2 Q. {
" Z/ T' w% b7 Y8 q% M& a3 ^如何在CAD中应用呢?
0 r  O* {; l% A, A' f" }' I1 r' J$ ~+ Q
OPENINMODI:0    输出文档不打开
2 J/ z7 u/ p4 Q& o3 e/ L1 t* o% B               1   输出文档在MODI中打开
' I) q7 A: @" d6 B& A* l
2 n% t; B9 a! J& @# B* e+ x1 @- x- x" S! \; U: v. ~
研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
- r4 ^& b, G& e2 p' M我用下面的代码做了一下检测. _! d% [% w# Z
  1. * ?) q& N) c$ ~+ a' \
  2. Sub A()
    2 q' N. Z# s& Z2 E: h9 y( ]
  3.     Dim H As Long, I As Long: h3 v, @% O0 ]/ P" f2 E
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging" 1 a" }) }+ R+ Y
  5.     PostMessage H, &H10, 0, 0
    / a) {8 T! Q( r# Z
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 0) L* P1 {6 R: d2 ]$ R" c2 R( L9 Y
  7.         I = I + 1! }& K3 _5 `7 W) g
  8.         DoEvents8 O$ p' h4 U7 X
  9.     Loop
    / P( T2 y7 p5 n" Z) a: x5 A. ~
  10. End Sub  s+ N4 K. t. m* M3 B4 ~5 {6 Z
复制代码
$ K$ @8 s5 O) ]! O
在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。
1 B* U" |5 j" j$ r5 E( N3 G建议你参考这段代码,尝试一下,在发送关闭窗口的消息后,接着用循环检查窗口是否可靠关闭,确认可靠关闭后再退出循环继续向下运行,看看结果如何。另外,也建议在循环体中加上 DoEvents,否则,在mdi文档生成过程中,程序会进入循环体运行等待文档生成和打开(在我的电脑上调试时,生成一个mdi文档大约需要30秒),此时CPU占用率100%,电脑会假死,你其它什么工作也做不了。
发表于 2009-10-27 22:31:11 | 显示全部楼层 来自: 中国江苏无锡
既然是虚拟打印,为啥不可以输出以后在合并呢?
 楼主| 发表于 2009-10-28 08:30:39 | 显示全部楼层 来自: 中国天津
原帖由 woaishuijia 于 2009-10-27 20:45 发表 http://www.3dportal.cn/discuz/images/common/back.gif
% d8 t6 A1 `9 ^. c我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。/ P2 I: i5 E( p) a
我用下面的代码做了一下检测# L& k- d, R) ~; h/ ^5 ?8 L3 `

9 `# t6 d, o+ W* M/ ?& n' QSub A()
* E7 M& y$ K% \) ~" [    Dim H A ...

/ z* K2 m5 W/ E3 o) z5 Q1 x5 _) u) B9 Q3 }4 c; B: {: ?

. B% m1 B: q) c2 L9 q: R0 P( ?谢谢斑竹
7 b  S4 n0 j8 K窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行6 W2 w+ \( R; Y, y
sendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif" M! u4 f; C8 m
既然是虚拟打印,为啥不可以输出以后在合并呢?
; p/ A8 G6 m5 ~0 S

! z: p" [& G6 z  D4 \, k我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸
$ ~: X8 \' V7 j' h1 o- P( l
0 R8 V' j7 z+ m' A输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:" R, G- |! }) q, o
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
6 J* |9 @% W1 Q. ?/ Q    .........& K$ j- \; D7 S7 a( [' X
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式# J* i: F& P! i' Z9 }7 c
    .........* W  z! d/ h6 B7 ?1 E
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
2 K* I9 ]; ?. v$ g        ........# ?& G" X/ E- T, z
       aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi123333, tempName)    ' 空打印,但仍然会输出文件,而且该文件是无用的
 楼主| 发表于 2009-11-2 18:32:12 | 显示全部楼层 来自: 中国天津
原帖由 157787698 于 2009-10-28 12:27 发表 http://www.3dportal.cn/discuz/images/common/back.gif
4 y8 u& f5 t! C测试发现:
/ D) Q  t. X- p1 y; _    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:, [! u; H1 \* N' X$ v3 Z9 t
    .........' r4 H% K3 \# |( m+ S5 x
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...
5 p% x, R* I% ?* F0 `+ E% a1 h* V
+ m; [( k2 ~& f% J6 Z6 T8 d5 ]8 l
; j3 b7 W8 m2 j/ Z, M+ |: _! X
不需于空打印,只需要空设置就可以了
+ h" z/ i1 V0 h9 M9 T
( U4 d- F; D0 t- y, N4 ?+ F4 M
! _2 J1 ]  Y- f问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

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