QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
4天前
查看: 4822|回复: 10
收起左侧

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

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

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了
7 e: d' I" \( W/ i
# N" s. Q# S# o! H+ R- j9 _在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。3 N% Y9 f3 C# h3 e

% J6 E+ f+ P- J6 ^8 p" L' X但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。$ q9 V1 p. k. {

! M. e  m* G4 n! U这就是说plttofile方法是还没有运行完。' o& b; _$ ]! ~
# o4 m. g$ ~6 Y, d5 [
问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?
+ u( I, K4 r# S" w# {4 d6 c! |. j6 i) g9 g: w6 L+ `& B) @0 g
[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:0 ~0 E  r7 ]- S9 y
Private Sub Command1_Click()
* [/ D7 u' n/ V* `/ W  _9 q     'plottofile方法
! i$ n3 q7 P5 ]) G% E# F     Unload Form1
0 T* R; |" o/ s- @/ W# ~3 TEnd Sub
9 g; e* V/ m4 R3 |, j  H9 kPrivate Sub Form_Unload(Cancel As Integer)
% U& r% {- ~  u- c6 m' x  I     '此处写入需要运行的方法; [3 N- r: ?1 w$ @2 F
End Sub
  ?0 @8 a0 R1 }) }1 W
  J& R8 F9 v3 z# P) G# K从运行过程看应该可以,明天去单位试一下
发表于 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
$ q# B5 M# }. H2 m4 _5 Y检查指定的文档是否存在或许会更好一点?

+ \* R  C: |+ ]- B; L2 y
+ ?  h2 h. G. C( L6 O7 y
% @8 R& D0 J) F7 j, v  g! o6 G2 q+ A( ^! h) R0 I/ U
文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开* ~$ a  k- K0 ^7 t

5 z' \# s2 O" d1 k9 f3 l& o程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)9 `( n" X! e! G3 X( {

; D: z* x- W& ]4 v2 L    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式
4 N* |2 d& ?/ z6 z0 W* [    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
2 X1 Y$ a  w* x
3 u2 \$ Z  p1 e3 C  ]7 q- ? RetVal11 = 1                                                                      '关闭PlotToFile输出的文档
0 R9 c2 ~& b% }    Do While RetVal11 <> 0
7 A& ^0 S& s3 q4 J/ A      winHwnd11 = FindWindow(vbNullString, drawname11)
0 u0 }: @" F2 `7 {        If winHwnd11 <> 0 Then5 @$ w) ~5 `# X, e% m) I+ J
           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&)
. }7 z2 ^$ Y1 h7 i( d6 H# l! _/ `, y( h           RetVal11 = 0
3 ^1 u& |+ y% i        End If, z8 w7 h6 w/ M2 }
    Loop- ?) C4 Q7 Y: ^4 F6 z
RetVal12 = 1
7 K. U9 S5 L( N0 a& Z4 E    Do While RetVal12 <> 0
7 c4 u" v& n3 U7 L+ X- U      winHwnd12 = FindWindow(vbNullString, drawname12)7 ^7 \9 K- g7 x
        If winHwnd12 <> 0 Then
5 ~) y4 C* a* @           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)* O: U2 S& P7 H. A" T: |3 k7 Y
           RetVal12 = 02 \% ]8 w0 M; M  x: R! C4 C( w7 a3 ]
        End If
' q  m% _5 m: [4 s& Z( f" [    Loop
, K  z- Y0 ]* N; {/ J: h& y2 Z8 Q* q* L9 g" F
   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档1 `* H3 G3 T5 D$ `1 m1 t
    Set M2 = New MODI.Document
* T! c; [# [# f3 J2 u    Set M5 = New MODI.Document
% n2 Y# Y, X4 T1 ]0 F   
* O: w! A4 \6 F. Y6 g. D    M1.Create pathmdi11
: s/ R8 h; P! u2 Y" D; }    M2.Create pathmdi12
) L8 l6 Z, R. ^  r    M5.Create
$ M" e/ v, z. t. C! m    M5.Images.Add M2.Images(0), Nothing7 s! k! X% e1 v& j1 ~. w6 X6 v: r
    M5.Images.Add M1.Images(0), Nothing
: C6 p4 {2 W* G5 @) E/ l6 U    M5.SaveAs pathmdi- |; A- M# C% J
    M1.Close
9 X5 `2 p8 E6 {0 Q, E    M2.Close
) i2 N) ~1 j6 |: H    M5.Close2 s% y' P) n' _- b# G0 ^! [1 B. }" J9 w
    Kill pathmdi11                                      '删除PlotToFile输出的两个文档2 s* L5 |4 f: \6 Q, |
    Kill pathmdi12
$ G, i- A: D% r" E' b) E) s) C# V) f* W1 ^
    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档
8 f; o. R/ Z+ e' V; d. A! K$ E0 _: I2 Y5 v4 Y3 M: e9 A$ z

9 b# f4 s- s  }) j; U8 b程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档
, l, ^3 z* W% v) z5 U# q# e# |: I5 o2 J, w- N0 W' Y
但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:
8 l. Q  }8 }0 m/ s* p1、程序死掉,需要关闭ACAD;/ ]' V( j. D' u8 ~8 a1 |7 t: o
2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;
' m  i2 \1 G. K" a7 Y1 o3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。% G) W' m! c+ O" V% l
* A, H' X  r( ^
现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的  \8 p5 C- O% e

$ V! ^5 L* j7 L' v" ?/ E% p) l2 n如何在CAD中应用呢?; Q( q, p" u( m  G7 _

9 s  J- V6 q/ X* ZOPENINMODI:0    输出文档不打开3 z* o' R7 X; W1 y8 i8 b6 K$ Z6 V
               1   输出文档在MODI中打开: B, |! i2 C% h# a

6 [3 G3 G2 p' P/ {1 z5 h
  P2 z, q% }- D) ?6 g  t" P研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
. @4 q  {6 r; m7 w7 H4 h1 s我用下面的代码做了一下检测- q. M9 n8 t! R  |$ C

  1. % J( j( h( C  j* s1 o& I7 I: k
  2. Sub A()% |8 g, }# y- J7 I
  3.     Dim H As Long, I As Long5 o. x! Y$ _; q9 B2 f, j6 B) b
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging" : ]+ l4 r: R9 U& t* F
  5.     PostMessage H, &H10, 0, 04 M, H5 a' s) L7 P3 i
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 07 d* n. Q! B' W
  7.         I = I + 1
    9 {7 d* L8 a. y- Z# m) m' L
  8.         DoEvents9 Y# X2 s' \2 e! L
  9.     Loop+ \% U5 [6 B) {# \% M
  10. End Sub% P: N) v& U4 _" m
复制代码

8 Z. z( w4 O. C" d# L在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。
9 o1 L2 ^& J& i* D6 \4 M0 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
' z! c& v1 m. U  [$ v6 @我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。, E' u. x4 K6 J% ]
我用下面的代码做了一下检测
: v/ q& o3 g$ k' C- h1 s
3 I- u0 Q. [  u- `* v4 _Sub A()
% y& I# @! d( i( V# o    Dim H A ...

: h* r, K' W7 K+ U, [2 d$ e7 a  g/ e4 c% Q# z% C; p1 j

# P: E0 ?/ j; ^" d谢谢斑竹
* a' B0 \" y* D, h窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行% u* e; n* P9 `8 B) ]3 o
sendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif
/ }: \1 _' L- P1 `/ |9 t既然是虚拟打印,为啥不可以输出以后在合并呢?

8 G* [5 R5 N: N: ^1 g; N; g6 t9 |7 k4 Q0 u
我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸
3 o+ J8 J5 M) h7 M8 v; W
3 L6 h$ j1 E/ {输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:
# K& v* U  D2 A1 P$ Z' m5 {    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
. e9 E* k+ A& a  n1 L    .........  q! v4 J3 _/ a, i; J1 `0 C
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式
1 r. s5 O- `) |" @& b9 ~8 H! X    .........
7 _% [$ c4 i/ @& z, Y0 w    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
4 r: y9 ?% m- V! s, j9 T5 t/ l" S  }4 s        ........
" _  F/ E' J& G3 [) t# W       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- a9 ~' r9 J) V3 H
测试发现:- p7 p/ f$ j/ {4 Z! F; S
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
8 f+ d' `  |6 b, |! c    .........0 `) e6 {4 [& P" y* A% t
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...

* X6 T) {! S1 [1 ]! D1 X* F; h& i; X, G: W( Q- A

$ O1 j! _: l2 H% A不需于空打印,只需要空设置就可以了$ n9 n; E' t6 Q  @6 m$ w5 m7 ^! u& Q

* O+ W! ?/ k. ?3 ^6 Z
) i8 B  z! Z: e' N问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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