找回密码
 加入
搜索
查看: 8482|回复: 16

[系统综合] 函数调用怎样相互不影响[已解决]

 火.. [复制链接]
发表于 2011-7-11 09:48:21 | 显示全部楼层 |阅读模式
本帖最后由 leon460 于 2011-7-20 15:44 编辑

比如,checkfile($source1,$target1)里面有100000个文件,难道非要移动完这10000个文件才能移动checkfile($source2,$target2)? 请问怎么修改代码
$i=1


解决方法:暂用 coproc.au3 多线程解决。

Do
        
        checkfile($source1,$target1)        
        checkfile($source2,$target2)
        
        Sleep(5000)        
Until $i=0

Func checkfile($source,$target)        
                $filenum=1
                $search = FileFindFirstFile($source & "\*.pdf")   ;list 所有的文件夹名称,不遍历子文件
        While 1
                        $file = FileFindNextFile($search)                         
                        If @error Then 
                                ExitLoop
                        Else
                                sleep(1000)   ;;*************发现文件后,暂停移动,以防止次文件正在被上传
                                ;MsgBox(0,"$file",$file)
                                $MoveFlag = FileMove($source & "" & $file,$target)
                                ;MsgBox(0,"$MoveFlag",$MoveFlag)
                                if $MoveFlag = 0 then 
                                        Do 
                                                $fileNew = $file
                                                $filenum+=1
                                                $fileNew = StringTrimRight ( $fileNew, 4 );除去右边 .pdf 得到文件名
                                                ;MsgBox(0,$source & "" & $file,$target & "" & $fileNew & "-02.pdf")
                                                $MoveFlag = FileMove($source & "" & $file,$target & "" & $fileNew & "-" &  $filenum & ".pdf")
                                        Until $MoveFlag = 1
                                        
                                        $filenum=1                                        
                                        ;$file2 = FileOpen(@scriptdir & "\BackupLog.txt", 1)
                                        ;FileWrite($file2,$source & "" & $file & "  " & _Now() & " 移动此文件失败" & @CRLF)        
                                        ;FileClose($file2)
                                endif        
                        EndIf
                WEnd
                FileClose($search)
EndFunc        
发表于 2011-7-11 11:26:37 | 显示全部楼层
你是想多线程? 那我只能说AU3满足不了
 楼主| 发表于 2011-7-11 11:57:53 | 显示全部楼层
回复 2# shenrenba

不一定要多线程,只要效果达到就可以了,呵呵
发表于 2011-7-11 12:14:26 | 显示全部楼层
最直接最理想的解决方法就是多线程了.

但au3由于在最初设计时考虑不周不支持。

你可以用多进程试下
但多进程很难动态共享数据区
发表于 2011-7-11 13:48:32 | 显示全部楼层
回复 4# happytc


    没那水平就别怨编程工具不够强大了,有DllCall就足以实现多线程,就看你会不会调用了。等你到了高手的程度,再回过头来看看你现在说的话吧。
发表于 2011-7-11 14:14:04 | 显示全部楼层
不是一个概念的
就象你不会开车,但会请司机,使得车也能跑,就能说明你会开车了?
另外,直接支持多线程的语言,不需要什么高手,就是初哥也能直接了当地简简单单地用上多线程了。
虽然我也爱au3,但缺陷就是缺陷,没必要掩饰
发表于 2011-7-11 14:40:08 | 显示全部楼层
要不P老大你是高手你写个au3的多线程函数, 象那个多进程函数_CoProc("MyFunc", "para")一样的: _MultiThread("MyFunc", "Para")
发表于 2011-7-11 15:27:14 | 显示全部楼层
回复 7# happytc


    我不记得自己何时说过自己是高手啊。能正常运行AutoIt标准自定义函数的多线程函数,我写不出来,我现在没那水平。不过,至少我测试过了,测试了不下千次,测试用的方法不下20种,没一种方法成功。现在我水平还不到家,以后我可能会写出这样一个多线程的函数,但这需要时间来积累知识,我并不是在说能解决多线程问题的人一定会是我,我也希望有人能实现多线程。如果你还认为AU3支持多线程 简直就是天方夜谭,那可真是太out了,要知道古代的天方夜谭到今天都一一实现了,自不必说这是必然,正因为有人为此努力所以才能将近乎神话的事情变成必然的现实,不测试、不实践是永远也不会进步的。试问你在多线程方面,曾做过多少测试呢?~
发表于 2011-7-11 15:27:44 | 显示全部楼层
你可以调用命令行移动啊
run神马神马的
发表于 2011-7-11 15:27:56 | 显示全部楼层
这样楼主只需要
#Include <_MultiThread.au3>
就可以简单明了直接解决他提出的问题:
_MultiThread("checkfile", "source", "target")
发表于 2011-7-11 15:35:18 | 显示全部楼层
真是讨论出真知!希望AU3在这方面也能尽快得到补缺
发表于 2011-7-11 15:39:13 | 显示全部楼层

标题

回复 8# pusofalse
   .au3的我 只试了试把c的多线程函数封装成DLL后用au3的DllCall调用,但发现只能实现特定目的的函数,用于一般性自定义函数就总是会有这样那样的问题

个人觉得au3这种本身是单线程的设计思想
要实现不共享动态数据区的多线程应该比较容易点
 楼主| 发表于 2011-7-11 16:22:06 | 显示全部楼层
两位大哥,多谢了,虽然你们看的角度不一样,但是方向是一样的,呵呵
发表于 2011-7-15 12:45:31 | 显示全部楼层
理论上来说
AU3也是可以支持多线程的
C语言通过调用DLL实现多线程
AU3同样可以通过调用DLL来实现多线程
发表于 2011-7-15 14:51:18 | 显示全部楼层
路过,我不懂AU3,更不懂什么进程
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-6-11 08:52 , Processed in 0.100303 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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