QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了
. E4 E7 x! C6 Z: K# b" }' a" \, k5 q. @& G1 P6 ^& H4 Q1 t
在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。" |0 |& B* t8 V

" @+ Q1 p6 q1 ^  ^但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。
+ r% C9 n$ ^4 O& {( K" M2 a7 D
* g7 H8 G+ i9 P8 p: C, Z$ ?这就是说plttofile方法是还没有运行完。7 w9 o) }3 @& ~+ K8 ?
6 W. }6 d- I5 T" ^
问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?
9 O/ S8 w, T# a, s# y! o1 p/ E! N* W
4 E- V7 J3 Z1 ?) _[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:% \1 I  M4 ]  M$ |, ^: I/ y2 Y
Private Sub Command1_Click()
& `) i% z, Z* G, I: a     'plottofile方法0 r7 |; I% d& p! a
     Unload Form1
+ y1 h' E( S5 `$ K4 HEnd Sub5 R7 x- M+ @& X" Z  r- v
Private Sub Form_Unload(Cancel As Integer)1 N; }5 E( m* L9 m
     '此处写入需要运行的方法$ C+ o6 p0 c- y1 H" x+ m
End Sub
: H8 Z( N9 c. ]% y; P* b, \" }! j& U3 k' i  \
从运行过程看应该可以,明天去单位试一下
发表于 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, ]/ @4 \9 }& \8 f
检查指定的文档是否存在或许会更好一点?

7 x* |: L* W2 N7 C- T/ Y' f( `

7 m3 z/ \% N8 G- L0 }, F0 Y. a' R. y9 |$ H& z+ w* j
文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开! |; |/ P( S; x5 [

( T4 d' R* z: e程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)( q* O. Q# ?$ f

& v! V( d. Z6 a3 h9 a* J  F    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式9 o6 _4 Z0 V  f) [- M
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)/ k5 m# ~7 P& b- {: d4 x

$ W$ O" l& z2 w6 V# C4 [3 L RetVal11 = 1                                                                      '关闭PlotToFile输出的文档! [0 L: T; F6 B6 H2 r: r/ R2 m4 c
    Do While RetVal11 <> 0
; h" P" b0 V- |' M& b5 i% l! j      winHwnd11 = FindWindow(vbNullString, drawname11)
6 {9 N0 g: y. T8 b$ z/ z! K        If winHwnd11 <> 0 Then1 q" p, \: t6 u
           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&)
. I9 }9 C/ Z4 f6 Q& Z. E           RetVal11 = 0
0 N) m* c7 }; N' R        End If) Q8 M; Z* p* J: d$ z  n2 s
    Loop) \  U3 ^+ m* V, e; E
RetVal12 = 11 n2 A% b% |  B3 \) [, x1 @* `- i
    Do While RetVal12 <> 0! `. I9 {, _. N
      winHwnd12 = FindWindow(vbNullString, drawname12)4 e7 [9 N7 Q% x; p( m, S. ]0 `
        If winHwnd12 <> 0 Then
( \, O6 x, J+ R           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)
5 R1 V! L9 N3 V" g2 Z* ~+ {, C           RetVal12 = 0
) ~* o) ^1 w9 M8 j+ J3 W6 A        End If
; W# \* |0 s' ~; p; N    Loop8 B2 }5 X( E$ f) H) M6 g

# T( m1 q! x* d* Z$ W% B( F   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档+ t6 P: R  a( d# ~
    Set M2 = New MODI.Document
% M5 `8 t( v6 s    Set M5 = New MODI.Document% G5 b  O( a# Y
   
; K9 ?# A; I/ i+ I) |    M1.Create pathmdi11. C5 v% j/ [. u: G$ c' S, \. @, [
    M2.Create pathmdi12
% `9 K* V5 u* D    M5.Create; j$ v  U& S0 H
    M5.Images.Add M2.Images(0), Nothing
/ I1 z; F6 m- P* a    M5.Images.Add M1.Images(0), Nothing
6 l0 R/ O% H7 S' i+ |    M5.SaveAs pathmdi
; E" `- q5 k( F% q5 L2 O# e    M1.Close
! s) `6 J" P2 E6 g( G    M2.Close3 M1 o" f+ z  [8 X2 s- y
    M5.Close4 `& p& u8 P& ^& N+ x% s
    Kill pathmdi11                                      '删除PlotToFile输出的两个文档& o5 q# ]$ W: C6 g2 |9 ^
    Kill pathmdi12! N. y! ?" H0 T- x; l) f/ c
! u6 H9 r/ |; w" ~
    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档
) {0 H8 U) K8 m, R3 U0 }0 w6 i- i
9 s1 [5 D* b) D& v- h; }3 }' g6 I
程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档
8 ~) O8 A$ v) Q" ^6 b, Z; I1 O
7 C0 |" @$ Z; I+ l( v* ]2 I5 U但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:, f( [  I1 V2 }1 P  D+ t
1、程序死掉,需要关闭ACAD;
) x, W% J( b" J0 X9 R2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;
" j) y4 P6 Q& o! g$ w3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。
+ T' a, e0 Q. V  U" j# J. D) T( o- N3 u* U
现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的7 I1 _5 \% {$ R

% ]$ f  W" g  y' d$ h; G) x如何在CAD中应用呢?! \/ t5 V' {' c" ]( d  @1 h9 g

6 \" l3 X( ]5 M* [$ zOPENINMODI:0    输出文档不打开
* j/ d3 u1 z! e8 L               1   输出文档在MODI中打开; E6 c5 |0 T" F7 x( |

5 X8 a, Q4 e( {8 ]
% ~2 w# [+ X/ k2 k3 d$ ]研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。" a) S; R8 B. W9 p/ s  D
我用下面的代码做了一下检测
' k+ z5 _. _: x5 F8 y( i8 V

  1. 1 f! f  j& h. G& a4 o
  2. Sub A()
    ) `, P- w$ e4 @
  3.     Dim H As Long, I As Long
    # F6 i) }9 p8 ~, {3 k
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"
    & H. E0 C9 }7 y/ ^
  5.     PostMessage H, &H10, 0, 05 u5 [! ~/ |- e1 B
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 0" d- b7 w, K9 T; N! ^1 f" V5 j
  7.         I = I + 1. v7 ]/ b2 I' l* o6 W
  8.         DoEvents
    7 x$ F$ I6 N; ^' G: R/ \
  9.     Loop
    # e" K- `$ J2 X& s5 b/ x4 l
  10. End Sub+ C; f: M. X, v& `. x
复制代码

6 B# ]; R) [, |" H! g在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。
$ r. f' l6 }" i( ^; B6 e8 E  }建议你参考这段代码,尝试一下,在发送关闭窗口的消息后,接着用循环检查窗口是否可靠关闭,确认可靠关闭后再退出循环继续向下运行,看看结果如何。另外,也建议在循环体中加上 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
- b$ v& K; T' y3 _6 m( c% S" R, {5 r: |我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
* T/ p5 Y9 K1 `7 N8 N# L) r我用下面的代码做了一下检测
$ g* q2 v3 f, o& y
# h1 K3 y/ d" ^Sub A()) S6 b  t$ e( |9 n
    Dim H A ...

0 O8 W1 ]) ]' k" d5 E. M" D3 k) W8 E
, p( V1 N' q) u6 K9 m
谢谢斑竹, W: @- V& a* H9 @" L
窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行
. L" T) w% ]0 Gsendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif) {5 B' p6 N& h: X* _+ T+ L
既然是虚拟打印,为啥不可以输出以后在合并呢?
7 R! c: S  A1 M$ x6 p8 V

: d- ^: t- C8 |# I7 @) B我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸
: |0 J% @. v* s' f+ ~
; ]; R# w. B7 S" W0 }输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:5 C7 H1 P7 G- [% `: x( c$ K3 Q
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:: a" E% u. [, z8 b! K
    .........
4 ~5 A2 e; m% G- }; l    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式
* Y* A, q1 f6 @5 W" z    .........
5 p7 W( J: s1 V4 P) G, v( k    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
) N3 {( P& v* J1 l/ ?, q; d% o; S        ........* d' f) }6 U& n2 C
       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
3 S! Q# W# M1 T# W. r- q8 C6 R' w7 b测试发现:
3 g" w' G! J9 R: x7 m    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
: i2 c3 W: e# K) {( L  [    .........
. m1 O) ~5 L4 n6 J1 u7 D    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...

) F  X4 Z; G1 \4 d: y) O
$ b6 J6 h: z. c; h) L1 z+ {6 ^7 @+ n6 z; M% L0 C% y3 c
不需于空打印,只需要空设置就可以了0 y4 s* j+ i! N$ c- r2 _9 b

& N* [+ f6 ^7 r# ^, W0 H7 y: H5 F: Z& g* C
问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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