QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了) q% x& r. ^; c+ C* E, Q

- w0 e! U; h2 m6 h* @在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。. ]5 F! A% q# ~4 J* p7 r# r

) z4 d6 G1 x& t! X但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。
! b7 m# _- f1 k5 S% g% E- G, K! K! t8 |2 }+ c5 ~9 j
这就是说plttofile方法是还没有运行完。4 p. n2 \/ c' u9 G/ K

& L$ `+ p4 o$ n问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?9 x' `9 ^' R' I
4 D6 s. s* l) D$ k9 F
[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:
+ K; C9 j6 u& C8 L: zPrivate Sub Command1_Click()
& d. p+ O, n1 [" J* t     'plottofile方法
$ w3 A/ X, B8 G  v* {     Unload Form1! H( q9 T7 @! r" ?
End Sub2 Y9 a5 |2 ^0 r
Private Sub Form_Unload(Cancel As Integer)
5 W4 Y5 ]9 E/ B1 \  ~- w     '此处写入需要运行的方法  |( y1 {8 q( S
End Sub# q5 X( ~. W9 o, P$ @

8 z5 L, N5 J% ?+ V$ p! Y从运行过程看应该可以,明天去单位试一下
发表于 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
6 v8 Q- `  k8 A9 x: h检查指定的文档是否存在或许会更好一点?
& l. q& Q. u2 }
/ j  {2 m& _% q( x8 i" [6 C, c
) K+ ]. r2 ^6 f3 g  y. o% h

  d1 x- e* |- U% b0 }文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开
- a  U" D" n7 F. ^% p2 r1 U$ d# \( E/ k
程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)
- E7 M9 t9 Q: E1 l. F$ z- ?! D6 B
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式/ _6 |$ [! F" s/ Y8 \/ E
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
, q, t2 |9 @) G( x/ W* @* F* g  J) q9 c% ^  C% |5 M5 l$ `
RetVal11 = 1                                                                      '关闭PlotToFile输出的文档
% _# v6 \' Y; a! O4 w. A+ M# G1 u0 t    Do While RetVal11 <> 0$ D6 N) d7 |1 z5 v
      winHwnd11 = FindWindow(vbNullString, drawname11)
) `1 V5 W1 J* |2 a! ~        If winHwnd11 <> 0 Then
) E- Z4 s0 i  E+ x/ A. v5 b           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&); N1 W" O: s* p! _& X) d
           RetVal11 = 0
) k+ a( ?- _; _% ~5 w4 s9 D" [        End If; J) C2 s* R4 W" \  L
    Loop
5 b% k( O; m) g8 [1 O3 D* qRetVal12 = 1
2 e! Q( w  B! v/ }" S7 m6 G3 C    Do While RetVal12 <> 0
% \) N$ z- v: {/ o* H      winHwnd12 = FindWindow(vbNullString, drawname12)
* O1 W+ u/ G& C; v* |; n4 u" \/ `' g8 I        If winHwnd12 <> 0 Then* n/ [: M: d! V5 J9 W
           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)
0 l4 R& E* e( C           RetVal12 = 0
' Q, t: f! f, ~( T0 N        End If$ q  G  f0 ?8 {' T: d) h
    Loop0 y! W! n: U# N/ e. _

2 s; v; K* |4 K* E8 P( L; J   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档$ c+ x1 ^" a% ~$ g
    Set M2 = New MODI.Document
6 @# X- d- J1 H  B4 @( F    Set M5 = New MODI.Document
' y: G( i0 k) v# O, O: @6 L    - w- q9 F# o; v2 V6 I2 R* d
    M1.Create pathmdi11( N0 Q; n. H8 y8 Q/ I; ?4 \
    M2.Create pathmdi12, D2 t8 r9 O. |) R5 ~
    M5.Create5 o* P" P) b$ r: i7 q0 V( P
    M5.Images.Add M2.Images(0), Nothing" C1 y$ I* X; Z. R9 f, G3 b
    M5.Images.Add M1.Images(0), Nothing
; u6 f7 v! w0 O    M5.SaveAs pathmdi
1 I. h; H( `! P. `1 y7 {1 a    M1.Close
( D: D- `6 y0 W    M2.Close
6 C$ G; j, w0 v    M5.Close8 R/ N  v% H1 c, P4 G9 k, a
    Kill pathmdi11                                      '删除PlotToFile输出的两个文档
' s* ]& t1 |4 ^8 J0 x: o% h; x    Kill pathmdi127 y4 k% ?( V5 t
- z1 C2 o7 z7 E
    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档
" N: ~  I! D$ }' {- B
& r; r+ ?6 e2 P
) C, _8 l, {7 y/ \# }程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档) V4 o0 _9 i# L

% ]3 P1 W6 @7 y但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:
/ I) v2 n, X2 a2 D. c; _1、程序死掉,需要关闭ACAD;6 ~& ^* X" \7 C
2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;) e4 x3 Q6 U( l; A: e
3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。
- i: V/ z& d: N' e  P# J/ d8 U& A0 i8 V# J4 ^, _
现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的5 C. P# Y, s9 l$ t: }

) W" F4 L& v* A& a如何在CAD中应用呢?/ F, g6 A2 M( J# X& s

: @# P. ^, x. T1 `/ G6 ZOPENINMODI:0    输出文档不打开
$ K. \) f# i2 N& `9 w               1   输出文档在MODI中打开! ]0 y+ D+ e3 d/ p. J& q% m9 l3 V

4 Z4 \0 O. e8 H) W2 }7 T& i2 f) ?. x% W: \
研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
2 I/ [2 @; }/ _我用下面的代码做了一下检测$ i- G) k# h1 b7 }: g; P$ s- e
  1. . A3 k+ w* O; V! o7 {
  2. Sub A(): b6 b5 s7 l0 ?
  3.     Dim H As Long, I As Long* c7 N4 L8 I0 j$ \( o5 s" T. K
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"
    & _- f" V/ r: t3 p
  5.     PostMessage H, &H10, 0, 05 q6 ]) W8 U1 Q& }9 @. E" Z
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 0# O% A9 ^# t: D3 t
  7.         I = I + 15 t' p8 {4 P% l+ [7 B
  8.         DoEvents. M, r& p  t) x/ r% X+ s
  9.     Loop
    $ S- B1 \. v1 G; |+ P
  10. End Sub
    $ ~- o' @) \$ j7 z5 U( p; W4 D
复制代码

, x7 p) T% [9 |/ y8 M在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。
  d+ T3 w2 S7 A3 e! B& 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.gif$ Q+ Q6 J1 T: D  L3 j
我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
4 N/ X3 w! P: p0 W我用下面的代码做了一下检测( t& j/ I9 R; s
/ Y1 D6 u# S6 s4 n
Sub A()+ O9 b  t- m1 }" |2 D
    Dim H A ...
8 y8 ~7 t/ e( W* g* ]
  {. s; ~, G1 V  S+ u1 B9 u
5 t2 {$ @& y0 K' o' [- T' u6 F7 ~
谢谢斑竹+ B0 s0 s/ T% E- s) l
窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行
; [( m; f# N' z; t& r  gsendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif" u. _; E2 E3 w7 `
既然是虚拟打印,为啥不可以输出以后在合并呢?
6 w8 W" P, I3 u" Z" {6 ]& `
1 g' p: D8 `; {  p& o
我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸/ h2 h* o5 ~3 A2 N

' t; U' r9 Q5 G) C( O+ k. Z输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:: a" H- X  Z0 ~) b9 X+ v. R
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
  I7 i7 ]) l: [    .........  V; R7 m2 q8 v( z
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式4 i7 t+ j8 u! F- ?) c
    .........
# ]* J, `" v3 U4 X2 Z" y    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)( `$ }* X: N5 L7 n+ \
        ........
% ~7 D* O$ s! W' Z! Z/ k       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
' E& w/ H9 E4 z9 a" F8 J测试发现:
  Q+ Y! q8 s3 k% d* h    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:( q, w* |3 B  {! [
    .......... d4 R0 r# {6 v" ]* K
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...
7 L3 g( J" c2 p3 C) R5 V- u, t, p
9 f$ C+ _" k& q  U& J

0 l! q6 x- V8 D* E, E; i8 H不需于空打印,只需要空设置就可以了/ ~' b% s9 H- d: t8 }+ F
: d+ T- ]* Y$ e; s4 I* [  v9 k
% f/ v; O- n& H1 [) z2 ?5 w$ y
问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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