QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
2天前
查看: 4817|回复: 10
收起左侧

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

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

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了
. b+ f/ ]$ v1 d- p
5 A1 E0 H3 |1 l& \在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。; e2 w/ q- i2 ?0 g& E
# c/ |8 K! t& d$ \. `
但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。
$ V& E# w7 k4 J; X7 T' s
' x1 J6 L7 j8 M6 g1 @; a这就是说plttofile方法是还没有运行完。+ K4 P/ D3 h& v2 l' T; R
; }* R3 j8 W$ }6 J  J) L
问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?) g2 `. J4 K0 s
/ j$ L+ y5 [6 {# ^
[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:4 T5 W. y1 c4 V# f+ R* W
Private Sub Command1_Click()* F7 v0 {7 Z( U
     'plottofile方法
5 i" d( \: s+ C- S3 j- b     Unload Form1
2 Q: M4 \$ D! W$ h: jEnd Sub
4 Y/ i8 m' B% b5 J  a% g" GPrivate Sub Form_Unload(Cancel As Integer)
( G7 w, L; H( z$ |" m" a* E     '此处写入需要运行的方法7 v4 L6 h. X0 X. t" N/ i" B
End Sub
7 L. v: ]# T3 ?: T! ^: P% O) h+ Z* c! o) T" P3 e" Z; [
从运行过程看应该可以,明天去单位试一下
发表于 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
1 B) }( |% {2 C8 |2 h: b1 ~检查指定的文档是否存在或许会更好一点?

, ]+ e2 v$ N6 ?8 B1 T8 l$ e
! U: m" f# O/ r1 Z
7 R+ y* a! X  }. n- ~" [. p: Y' O, ~% e( _) P
文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开
1 T, T5 |- h# W2 v, z0 U
. X- ~% y! `& z1 J: L程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)
  n; @1 b7 p4 l
$ P! [# O0 v& Y' [" c5 r  D! |    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式$ S$ A% B, `7 H2 o# E  a8 A
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
4 {4 \4 M& i: a; n& @+ Q8 [  s% h, B+ K
RetVal11 = 1                                                                      '关闭PlotToFile输出的文档+ k6 s8 W! R8 W! y! v2 y
    Do While RetVal11 <> 03 t: g3 b% b) W0 t3 ?
      winHwnd11 = FindWindow(vbNullString, drawname11)
0 K( d* }# r( U! ^        If winHwnd11 <> 0 Then
$ i; @( t8 A: J, ]9 h           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&)
9 a8 E/ M/ h: `& n4 {           RetVal11 = 0
6 p3 ~0 U( r+ }# K% ]8 w; ~        End If9 i, q6 B; l4 }7 g4 j8 |; G3 a
    Loop
: v- |+ A& f* ~& r4 M, H1 cRetVal12 = 1; T; Z7 K/ m" \7 t( o( T0 ?0 T% }% A
    Do While RetVal12 <> 0
% @. J/ J+ a; U8 i& O& ^( O      winHwnd12 = FindWindow(vbNullString, drawname12)( f) I6 j% X2 {- j2 g7 m4 y& ~
        If winHwnd12 <> 0 Then6 r, c" `2 ~" \* x  J2 M8 Z
           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)
/ }$ @) o6 U& O4 O           RetVal12 = 0
( }. i/ w7 l5 e' V  c        End If
1 ~. q2 `1 w4 ~4 Z  B& p8 ?    Loop
" W1 L6 `" V5 B! C6 g0 q/ m: _5 A$ H/ T2 |1 {
   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档
' i$ B, m: B% v3 Y    Set M2 = New MODI.Document3 |& Q. o! O" C6 T4 H+ J2 N( A! X
    Set M5 = New MODI.Document
1 ?' h7 G2 f! U  ?' z5 K! \      {+ S/ _. y1 `5 |
    M1.Create pathmdi117 f4 v0 p/ i8 T& c* ~
    M2.Create pathmdi12; j% u- e; I7 q! J+ @/ z! z
    M5.Create
2 k0 D4 t+ i5 b7 L4 N* B    M5.Images.Add M2.Images(0), Nothing7 H, N6 E" q4 B! v
    M5.Images.Add M1.Images(0), Nothing
% r% _# n7 k; V1 I# n1 p& ~1 A    M5.SaveAs pathmdi
2 t( h' f6 t7 N0 B) B3 d3 |  z    M1.Close
8 r7 j/ e8 N, n7 [9 M    M2.Close
/ g8 u  P! L/ B! T3 u- U5 d8 Z5 g    M5.Close
% {; W$ i! }6 A0 w    Kill pathmdi11                                      '删除PlotToFile输出的两个文档
# p& |" T. s$ {8 P, X    Kill pathmdi12
0 F. S# q) M5 M7 i/ U3 j; c! d  B" s$ Q! x# M/ N( P  W1 C
    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档
5 d- K2 ~/ N. G" k3 i/ o* b# N! G" j, b/ h; y

1 M2 u6 H7 t+ ~# W2 C) U. \程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档
5 w" c7 \( X5 n6 F: f
: c  G: [, B, ?但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:
2 P& J) c' u) M: ~% F0 `1、程序死掉,需要关闭ACAD;1 `* l3 y2 W0 @" ~5 Y% |6 O
2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;. q' y' t' Z+ ?  g2 {$ ~
3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。; M( \) ^2 n, z/ G+ k, n& z7 G& v( |

0 U1 b4 K3 [1 S, j0 E1 y( D现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的* S6 C2 o: {6 M% `
0 j6 Z5 K7 ?7 Z* x0 \! H! o9 v
如何在CAD中应用呢?( D4 K+ T% G* N" q
+ \0 W2 _5 v, J0 ?9 j- {, ]
OPENINMODI:0    输出文档不打开& L7 O3 {2 S$ i3 m! s9 ~
               1   输出文档在MODI中打开) U( {- z6 h3 d: [, X
2 g5 ]+ m7 D3 J- {, s; @
/ l' V8 G4 r6 a4 n- e! R/ M. \( Q
研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
8 u; W( Y. l% n2 O4 E我用下面的代码做了一下检测
% S  G! `: j! p# n% O' f- P! K

  1. ; J& M, D- k! `0 L* ]
  2. Sub A()
    9 `& f) _/ L! T; m' w
  3.     Dim H As Long, I As Long
    8 F; R* _+ }+ ^  r2 W$ k# n
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging" * L; I6 G% S& k( ?- i5 z
  5.     PostMessage H, &H10, 0, 0
    4 N4 n2 c/ J$ e7 r+ o" h3 e
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 0
      E1 s0 h; S4 m
  7.         I = I + 1
      l- z3 ]7 U2 i- C* f
  8.         DoEvents
    4 v7 j) u  M' Z3 Z6 V  u
  9.     Loop/ S* u' z% g8 N; }' R( E7 X
  10. End Sub; J4 I2 |) e; E  D+ ~, ]0 K
复制代码

+ J: Z; E* u3 O6 M3 s3 X在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。
* M" C( X) f, x, J/ B$ x建议你参考这段代码,尝试一下,在发送关闭窗口的消息后,接着用循环检查窗口是否可靠关闭,确认可靠关闭后再退出循环继续向下运行,看看结果如何。另外,也建议在循环体中加上 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
) q% j1 y( |0 [我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
6 O4 e: f0 `9 [# L" h$ @我用下面的代码做了一下检测$ Y! a: |/ i( o# p. W" V" H
) z% p3 Q" x0 F
Sub A()
4 h6 T5 y5 b. j  G    Dim H A ...

  I; g) L* Z8 z2 a% \
; ^; Y* z/ o9 E, S7 v
3 d4 c& o0 v# ?, ^# b, D谢谢斑竹
6 b0 V9 o/ H2 ?" U5 w7 _4 i$ ~窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行) `* Z" R/ }- P/ a. u4 \6 C
sendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif
" \& h! R. u: A既然是虚拟打印,为啥不可以输出以后在合并呢?

) o# ~5 z2 C# c4 @7 b2 n& v  }) O' t% H( V& x
我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸; w) s/ D: S+ K7 Z0 v

. d. i) F7 U4 L, j输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:, n+ }/ \7 `4 P- @: D4 k$ |
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
& `, I! B4 k, R+ ^# \$ ]  V    .........9 Y4 `4 F1 U* y  @2 E# R7 r
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式. V# H+ {$ `, k, \2 @+ h# l* N
    .........0 S6 c, T" ?  f6 d
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
; u# l2 x  ~$ Q$ F( ~8 Y! X        ........4 J: y5 ~& c$ E
       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
8 R: N( S3 O8 w& G' ]5 r8 Z0 X测试发现:; N  W4 G% A( h- e
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
7 E9 ]# d* G" a2 ]; V9 T+ N7 Y    .........2 K4 q, n) q1 [5 r# s8 f
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...

! F6 F5 V3 _0 N$ t. w5 r, j5 A. N! V; h' J5 y0 J
& {; U! |! [0 M( q
不需于空打印,只需要空设置就可以了$ [4 |& p* {1 k: z1 {3 |6 N: c/ p
! v0 o- w4 K- D, x  C8 T: A& Z

9 e' r- z& {6 H' H( X( w问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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