QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在使用虚拟打印方法plttofile方法过程中发现,在plttofile方法还没有执行结束程序就已经执行到后面了
8 c# `3 L2 f/ x& P  W6 N, M& _
$ `- Q% Y9 f* }/ T3 ?5 G: f在同一过程中,如果在plttofile方法后面对输出文件进行操作就会出错。
5 Z, k! j/ c0 V: H5 y, M$ D
/ U; |- \) q( V: h# C6 k+ F但是,如果在另外一个过程中对plttofile方法输出的文件进行操作就没有问题。
, M4 G$ {; E3 c6 s9 U
* ]1 J! w9 d* M7 s2 X1 U" }1 U) V$ ~这就是说plttofile方法是还没有运行完。
8 E" x7 F9 C2 y5 q2 q8 p' F' e0 m4 ^7 Y$ k+ v: P
问题是:如何在plttofile方法执行结束有返回值时才继续执行后面的程序?
  x3 ~* [) D; @2 R% ]) \9 u7 K% d3 j, A
[ 本帖最后由 157787698 于 2009-10-26 18:05 编辑 ]
 楼主| 发表于 2009-10-26 18:56:35 | 显示全部楼层 来自: 中国浙江杭州
解决办法如下:
# ]2 U* _1 Z' c% B- H& `. x: Y& EPrivate Sub Command1_Click(): H' V6 R& N9 ?) ~# X
     'plottofile方法! v' M0 i# ]1 P  B1 w* i
     Unload Form1; l. E/ u6 }2 |- B2 D6 S# [% [6 [
End Sub9 L+ g  K" k" ?: h: H+ {( ^
Private Sub Form_Unload(Cancel As Integer)1 b6 t1 l; X; p
     '此处写入需要运行的方法# g( V5 i7 J3 Y  [% J# Z
End Sub+ n& U( ]3 B, c+ @

2 Q; y/ z. F0 s8 r' x从运行过程看应该可以,明天去单位试一下
发表于 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
, C  ~* x% V; l8 P* M  u7 E' ?' U检查指定的文档是否存在或许会更好一点?

, `( e# M4 f. y* p0 Y7 N/ ~" a4 `! x5 Z* K
4 L& v, _  J, x. S8 S7 N
/ _- ~! b( \1 O9 t0 [) _( f, O
文档肯定存在,只是不知道什么时候开始存在和什么时候被打开,当然在plottofile方法执行结束前是文档不存在,而在plottofile方法执行结束时,文档存在并被打开
+ R: N1 b$ z1 F4 _5 _: V2 I# s- o, M
程序如下:(变量都被定义过,FindWindow和PostMessage也被声明过)
: N" Z% w; }( g& d4 z9 q9 _" h
9 ]# w2 K9 v+ |* w- S3 B: ]/ p    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    '虚拟打印为MDI格式
" `0 n* \7 R4 P# v8 w, Q. h    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
% x$ L3 c7 k" i% q$ q* s" n1 r5 U: h# A- J( X  t- ]# I
RetVal11 = 1                                                                      '关闭PlotToFile输出的文档
$ S' j; j& N6 ~  x- {7 b    Do While RetVal11 <> 0
3 L! }& E) X! |8 o; J7 O      winHwnd11 = FindWindow(vbNullString, drawname11)
6 n8 V7 S0 s  C8 L1 F        If winHwnd11 <> 0 Then. O- O' }! ?6 A: i+ Y
           RetVal11 = PostMessage(winHwnd11, WM_CLOSE, 0&, 0&)
. m: |( P* M& ?% W$ k. Z) o           RetVal11 = 0% p7 g2 Z2 l/ F
        End If, F, C7 D. @& g9 T6 m4 v# ^! ?+ W
    Loop' Z9 |- m+ I) ]+ Z* v- J! H
RetVal12 = 1
6 i9 G+ ]. v% v1 S    Do While RetVal12 <> 0
8 L% A( @, i" B  t: x8 f      winHwnd12 = FindWindow(vbNullString, drawname12)- o: @0 ^) Y3 A8 k% l9 C2 m
        If winHwnd12 <> 0 Then& i( i* L# ^6 P2 y
           RetVal12 = PostMessage(winHwnd12, WM_CLOSE, 0&, 0&)
0 |/ K2 m$ u, }6 Z0 m3 x           RetVal12 = 0
3 w, N* R2 W2 ?        End If
- X( ^9 t2 p, Z/ e    Loop+ r1 }& O% G  ~" Z% {: S0 S3 }

6 [+ a8 u: Q& Q( |( Z* c/ ]( X: }8 Z   Set M1 = New MODI.Document                  '合并PlotToFile输出的两个文档; B( [0 x2 ?' o! u  I( l
    Set M2 = New MODI.Document
2 y+ }) f) x  T+ j9 Q# r    Set M5 = New MODI.Document( W/ `2 m& p3 m+ q, C6 C* p* n
    ( a6 w! \+ g% l- o* A1 V8 _# s
    M1.Create pathmdi11. _& D/ w$ E) u0 S/ E; R
    M2.Create pathmdi12+ p0 m$ W* D% S; n
    M5.Create  X. Z3 x5 N! y9 \3 C
    M5.Images.Add M2.Images(0), Nothing
5 i" P+ l5 T( E  k/ j" M    M5.Images.Add M1.Images(0), Nothing
+ V& j% B8 o7 p2 s) D3 I    M5.SaveAs pathmdi* U- ]# j) @3 c3 s& z+ w8 D: q
    M1.Close
. i& |$ |5 D7 z# ^0 G! w0 q    M2.Close
! [0 B( z$ J8 ~6 L    M5.Close
9 r, H/ k  c6 g8 c    Kill pathmdi11                                      '删除PlotToFile输出的两个文档
- s0 W$ f% w5 i  j+ B    Kill pathmdi12
% X/ T( e; ]) U+ x
8 U; @  s4 T, ]" H    Shell "C:\Program Files\Common Files\Microsoft Shared\MODI\11.0\MSPVIEW.EXE" + " " + Chr(34) + pathmdi + Chr(34), 1            '打开合并后的文档
" M1 P+ @' M0 s& N3 O! O8 r
" O1 e  l/ x/ [6 x, q  [6 Y/ L8 I+ l" g- Z- F" ?0 U# _0 Z# |
程序执行过程中,如果在RetVal11 = 1和Set M1 = New MODI.Document  两行设置断点,则可以按照预想的方式完成动作——即虚拟打印输出为单个文档,然后关闭文档,然后合并文档并删除原文档,最后打开合并后文档* Z- Q7 z4 y1 l/ H2 {  U3 W/ \$ W
$ B, ]7 u2 _. T$ q2 z. v3 F' B3 p
但是,如果不设置断点,则程序运行无法正常完成,目前出现的情况是:- ]- e% f7 o$ z5 ^  G
1、程序死掉,需要关闭ACAD;
' Q# [2 T( K4 T! M( ]5 e2、只能关闭其中一个文件,然后运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,然后手动关闭文关闭的那个文档后按F5则可执行结束;# ?; N5 W- `/ m
3、两个文档都可以关闭,但是运行至M1.Create pathmdi11或者M1.Create pathmdi12时报错,提示文当共享冲突,需要手动按F5可执行结束。
( r! r$ V6 v" u3 u; ^. T* s3 ]: D; n; K; [
现在想到的方法就是二楼的笨方法
 楼主| 发表于 2009-10-27 10:23:48 | 显示全部楼层 来自: 中国天津
刚找到一个函数:Microsoft.Win32.Registry.SetValue(sMODIKey, "OpenInMODI", 0),这是OFFICE中的6 {& q- c! T9 f: ]1 J

. R, s3 k+ D8 O1 z* R! |4 {如何在CAD中应用呢?
5 y& G1 @  _% e9 Y: S1 M3 q
! A; |$ B) z/ ?: {1 _OPENINMODI:0    输出文档不打开
8 [' \! o: J  S5 W- n               1   输出文档在MODI中打开
6 ]- U! y/ i5 t5 s; r& X2 W4 Q% D4 s& L
9 @6 g5 C" a6 W9 g; b9 a
研究中......................
发表于 2009-10-27 20:45:37 | 显示全部楼层 来自: 中国

回复 4# 157787698 的帖子

我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。: U' S6 h2 e* |4 ]% a! i/ C! [- z
我用下面的代码做了一下检测. O4 J' X" l) l
  1. ) K( u" e1 p, N& k
  2. Sub A()
    ! Z& |8 o' f2 I" m# |8 S: n
  3.     Dim H As Long, I As Long, y+ H4 f1 W  ?
  4.     H = FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging" " u: J' B/ j; I3 i) ~9 S
  5.     PostMessage H, &H10, 0, 0
    8 h' ?7 u6 a2 u; {' Q. Q
  6.     Do Until FindWindow(vbNullString, "F--QJY3.mdi - Microsoft Office Document Imaging"  = 0
    % v, `. Z( X' G$ F! `
  7.         I = I + 1
    0 R& f2 r: i( N
  8.         DoEvents
    1 N0 C" N% [% O2 E3 i! T
  9.     Loop( R/ f8 r& V1 G
  10. End Sub
    6 s3 J5 m  N) Z4 c; }+ k
复制代码
" |1 Q7 S/ v3 d# W# \0 r. f
在最后一行“End Sub”上设置断点,运行了两次,一次I=348,一次I=396。而且我的循环中带有“DoEvents”,每次循环都要把控制权还给系统。如果没有这一句,循环次数肯定会更多。
2 D4 O4 U0 w4 B- N3 n% M# i" t建议你参考这段代码,尝试一下,在发送关闭窗口的消息后,接着用循环检查窗口是否可靠关闭,确认可靠关闭后再退出循环继续向下运行,看看结果如何。另外,也建议在循环体中加上 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.gif5 U. n4 Q9 G7 a6 J' u
我没试你的代码,但我认为:窗口的关闭与VBA过程也是异步运行的,你用API发出关闭窗口的消息后直接运行后面的代码,而不是等到窗口可靠关闭,肯定会发生冲突。
0 o4 B) D3 e/ x, ?; A% c我用下面的代码做了一下检测
- K9 |9 x" {! C3 l& k) {% E: M+ _% K' b) r
Sub A()5 m' a: Q% _+ P4 I$ _$ q
    Dim H A ...
4 y) C2 X+ D- a& G$ y# f

% R$ c+ o" K6 ~( g3 r" ~; H/ F
1 X7 G; X6 j* ~6 e3 ?谢谢斑竹
1 u7 i6 L4 C( Z$ _) ~窗口的关闭与VBA过程确实是异步运行的,但是如果用sendmessage换掉postmessage则可以保证同步运行
- x. [: F  B6 e5 F2 ^sendmessage要求得到返回值以后才继续执行,postmessage则不是
 楼主| 发表于 2009-10-28 08:32:42 | 显示全部楼层 来自: 中国天津
原帖由 www1974 于 2009-10-27 22:31 发表 http://www.3dportal.cn/discuz/images/common/back.gif
+ d0 X6 z9 N# [, y) @% ~* B2 D既然是虚拟打印,为啥不可以输出以后在合并呢?
# ~6 [+ R" Q  ~1 C! A% ]% }
% P+ ?1 f" A4 O4 U) Y, B, D
我做的这个面向公司层面的所有技术评审人员,他们每天都要处理大量的图纸,但是我们又不希望他们得到可编辑图纸
- W8 o. p& ~# o& ?9 a* F: ^- H* k
输出以后再合并会浪费大量的人力资源,并且会招致很多客户的抱怨
 楼主| 发表于 2009-10-28 12:27:53 | 显示全部楼层 来自: 中国天津
测试发现:. b' \3 e3 U7 t' h& r9 s. y. R& u
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:7 ~5 T6 m! Y5 L- ?$ M. K7 G
    .........9 r/ j8 F, R) q- n* o2 ]
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟打印为MDI格式
9 {) R9 t/ y4 e7 v/ t. p    .........$ q6 E& D- {6 _$ m/ m  ~8 d
    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi12, tempName)
) X6 c. d# c' M% y9 ]6 O5 w        ........
8 N' ^6 Q2 s2 J5 p       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
' [" M; [( r# X4 R; l测试发现:7 X/ A5 J$ ^: j! l' r
    只有最后一次plottofile输出的文件不能被关闭,如果加入一条空打印,就可以完成我要完成的任务,如下:
& k" J! }: y  A$ @( Z5 D  @. `1 q* R    .........
  e- J8 ?' P5 G1 H; x& m' ^    aaaaaa = ThisDrawing.Plot.PlotToFile(pathmdi11, tempName)    ' 虚拟 ...
" l" n4 g$ j- E8 ~! q
% Z7 b6 U# b' `- l

/ M9 Q" T2 J6 z! R" D不需于空打印,只需要空设置就可以了
: Z8 ]$ \; M! U2 ~  Z, t5 K; ]- L; `( z2 k4 B$ }- a

' h, ~6 P2 ?" U4 n+ @问题解决,斑竹请关闭
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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