QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了- P5 j0 O0 H& E5 E8 a4 r+ {
0 E$ p! Z' k" U7 t0 S; P+ H  R
在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。7 N' B. N+ }/ F% z4 M
- f% c: }7 t- P) ]
但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。
' \( x8 {2 ~3 ~0 {/ R+ q
6 J2 P/ G( `! @这就是说plttofile方法是还没有运行完。
* f# G- O5 H0 W; F" H
6 y* X0 |& O9 N问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?
: O3 [* @( h  d
2 {. g' p. Q( K5 m& T% Q3 `4 r[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:
% o# W$ n$ ]$ N. b  l8 [' w2 S% e. qPrivate Sub Command1_Click()  J/ P1 z! S$ M2 x0 q& H2 s, U
     'plottofile方法
% J% h$ A. N/ W* [3 D4 O     Unload Form1- ~& D2 N2 ?$ S4 n" X. V
End Sub3 t2 {/ ^% q: i. u( Q9 m
Private Sub Form_Unload(Cancel As Integer)
& h) h$ v7 Z; i( i8 r3 L% i; @     '此处写入需要运行的方法! d& G& g# ]3 G: N, h; r' p6 \6 R& \2 `
End Sub- ]( |: Z6 p+ B% j6 d

3 a3 {7 o+ u3 J* B8 R0 w从运行过程看应该可以,明天去单位试一下
发表于 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.gif0 {( J7 P7 r/ S- S/ P
检查指定的文档是否存在或许会更好一点?
& K7 g- q" \- l: ]- l5 I7 z

: O, n. A2 H4 ^+ B8 l* e& R. P; W3 k, L

' Y6 a1 T! m$ L5 k文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开/ @" Q( P2 d. k

5 H/ V( a1 X) C& w8 m( Y- v4 B( }程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)
! B: m1 h1 Z8 F6 |/ D& V
6 T- s4 s/ q- Z2 ?! |8 U* t# I: c    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式/ [% ^  P' K, H5 y4 Q' H6 M4 Q
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)# J5 |7 F% G  d6 H, t9 ]
6 H8 j. t/ n) R& k. P
RetVal11 = 1                                                                      '关闭PlotToFile输出的文档: \' `9 @6 y# x  a  l
    Do While RetVal11 <> 0- `# C' n' u6 y. \
      winHwnd11 = FindWindow(vbNullString, drawname11)
& Q" J% A0 v% p3 `9 W7 Q7 ]) `        If winHwnd11 <> 0 Then
2 A/ e  E+ V! O# ^6 i           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&)
% j/ }* e/ L# p, y4 U8 N" n           RetVal11 = 0
, Q, s! Q! c- X! Z/ t: g) Q9 r        End If! ]' G7 D' o+ o/ m$ U! p
    Loop+ I$ c  b: B7 L/ O6 ~
RetVal12 = 1
" ?( O7 H' u- e4 W7 Y: ?    Do While RetVal12 <> 0& B  a6 z+ ?5 k
      winHwnd12 = FindWindow(vbNullString, drawname12)& ~( ~, Z) ^3 V2 z
        If winHwnd12 <> 0 Then1 p4 l6 v; B- N1 r( z
           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)9 x3 F* s( v9 D2 X" c
           RetVal12 = 0, R4 q# e6 W. p
        End If5 U  X* E) ^* K: u. s
    Loop. p3 I7 G! _2 @- ?$ \1 S

6 W: S8 U/ I$ [- _' w; s7 }) a   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档
5 W4 N& p; f+ T" g    Set M2 = New MODI.Document
! T% Q# J; r' _, m# l    Set M5 = New MODI.Document) g- c1 P  G6 Y; S0 n
   
0 [  x6 W  x  S5 L    M1.Create pathmdi11
) t% l0 r4 u# {2 Z4 ^9 r" E6 H! J% Z    M2.Create pathmdi12- K/ r5 G( B1 d) q0 Z) B. k& V
    M5.Create, k4 y. p" ]' C* g7 k1 R
    M5.Images.Add M2.Images(0), Nothing
6 v- D! ?6 T+ n# y9 W4 z9 X    M5.Images.Add M1.Images(0), Nothing
& o$ \1 p+ t8 c. Q0 l5 x    M5.SaveAs pathmdi
" K7 |: W' W+ N    M1.Close
4 U9 k" I  g. ~1 R, `; s    M2.Close: p0 p1 i) }0 M- m4 {# r8 {
    M5.Close
/ x0 R$ s1 p5 x2 }9 O* B& y    Kill pathmdi11                                      '删除PlotToFile输出的两个文档
3 |. o- \7 s1 U& k& P  }# @    Kill pathmdi129 T0 D' I6 u: g4 N- I$ `/ [

" g- k) L5 x: v: {& U    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档
: ^$ H3 l3 W7 q3 t" Q: O
9 w- q# ~0 |0 J% x$ U: Q7 V$ w, @
  F; Z' `6 b6 K6 V: y0 s* u5 F5 Y4 a程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档( \) K$ ~3 w) U& n1 t3 \: P+ [

& v$ a% Z0 [3 m. s% r但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:
! P/ t3 H- ^  {" ^! N5 l' N: F1、程序死掉,需要关闭ACAD;6 [# @' x. h: E$ R: S
2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;
0 `- e' L: P; S) n+ U3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。
4 o6 ]8 ]1 [! a, n; q
, V: u( q* ]3 Q' U$ p) ~$ D现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的
) B2 b( B/ f  {+ _% v  |
/ p0 |) X: \0 B+ N如何在CAD中应用呢?
( ?1 E  ?6 I. g  U/ L) c  ~" W: F, O
OPENINMODI:0    输出文档不打开! ]/ ~0 d! B/ }
               1   输出文档在MODI中打开6 Y; T" G% L- M) g

# W$ X( [+ u' y; s
/ Z1 L+ {) Q; K# C4 v4 g# L研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。8 A- h$ H3 a. C# _" V, k8 J2 U) ?9 n- m
我用下面的代码做了一下检测
  p- a, j3 q: ?; X+ E+ X5 E' j' y

  1. 4 S: l) M& ~& l7 q4 k
  2. Sub A()
    7 I' S9 H7 z* }' U3 F6 M
  3.     Dim H As Long, I As Long' h& b- ~7 v! t9 w6 L. f" Q/ i
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging" ; q; E% s$ z8 u* V/ w0 M
  5.     PostMessage H, &H10, 0, 0: N' j8 d1 G* F0 w. u1 Y
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 0" g, C& A: w: M+ u/ {
  7.         I = I + 1
    9 [# |, x. x. O2 k! F1 y* o8 m
  8.         DoEvents
    $ j/ t7 o) ^+ x* N6 d  |3 \
  9.     Loop7 C6 P  i! w2 a
  10. End Sub
    ! T, r% M% P7 Q
复制代码

; _/ l) B. s- ~  c& }" ?* G在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。( _; V4 ^5 F/ X) k" x  ~+ K. o
建议你参考这段代码,尝试一下,在发送关闭窗口的消息后,接着用循环检查窗口是否可靠关闭,确认可靠关闭后再退出循环继续向下运行,看看结果如何。另外,也建议在循环体中加上 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.gif2 O1 L5 Z# T' A/ i
我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
0 ~4 G7 O, X& t& T我用下面的代码做了一下检测
2 o) L/ t9 z" i0 c' n: i6 b2 X* I, Z1 j
Sub A()
2 G/ z1 N$ s" r1 @  k2 ~    Dim H A ...
0 J* @# Z# R( e& Z

, i$ |$ K) f( }' M9 `  }6 i  r8 s1 h8 ]% x5 h
谢谢斑竹
# o/ y0 ~# e0 y: K, D5 o窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行
# Y# W: t% ~$ m$ U8 vsendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif8 u" F2 E; b- u" k! D5 a* B1 A
既然是虚拟打印,为啥不可以输出以后在合并呢?
0 {$ F/ }0 e. x! a6 Q
8 ?/ N: q' n4 u& x5 _1 |- a6 O
我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸
% `/ h  N3 ?4 w7 Q! N4 z1 @( J) r; \6 R! K6 s. h
输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:4 W* j. {9 ~+ V
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
1 ^1 g, v0 d4 n' H    .........
2 F( ]7 L  i* @8 x1 A, R    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式
9 d" B3 m8 ?  b1 W, f    .........
3 K: S* y; d$ G) P9 Y    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
8 c# t) |( m4 C; I0 q        ........7 |* H+ ^; ~/ B$ h0 x6 \" M
       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- O. j! d; w6 F7 R  n! _" Q  N
测试发现:
0 X1 f5 O7 T2 m+ Z    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:3 y$ ^7 q% l0 S, @6 c  e
    .........( c0 i* W& O% U( h
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...
" \; w8 e* f5 l6 i1 q
  \; u) w1 k5 M. S! P
# V2 N, F7 z, x1 R# j9 k8 ^
不需于空打印,只需要空设置就可以了
, G0 K6 n$ [+ e1 B. Y5 w$ ]! g+ e% F* r6 v8 J

" _' x! m& l$ [6 K4 x7 K问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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