leon460 发表于 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       

shenrenba 发表于 2011-7-11 11:26:37

你是想多线程? 那我只能说AU3满足不了

leon460 发表于 2011-7-11 11:57:53

回复 2# shenrenba

不一定要多线程,只要效果达到就可以了,呵呵

happytc 发表于 2011-7-11 12:14:26

最直接最理想的解决方法就是多线程了.

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

你可以用多进程试下
但多进程很难动态共享数据区

pusofalse 发表于 2011-7-11 13:48:32

回复 4# happytc


    没那水平就别怨编程工具不够强大了,有DllCall就足以实现多线程,就看你会不会调用了。等你到了高手的程度,再回过头来看看你现在说的话吧。

happytc 发表于 2011-7-11 14:14:04

不是一个概念的
就象你不会开车,但会请司机,使得车也能跑,就能说明你会开车了?
另外,直接支持多线程的语言,不需要什么高手,就是初哥也能直接了当地简简单单地用上多线程了。
虽然我也爱au3,但缺陷就是缺陷,没必要掩饰

happytc 发表于 2011-7-11 14:40:08

要不P老大你是高手你写个au3的多线程函数, 象那个多进程函数_CoProc("MyFunc", "para")一样的: _MultiThread("MyFunc", "Para")

pusofalse 发表于 2011-7-11 15:27:14

回复 7# happytc


    我不记得自己何时说过自己是高手啊。能正常运行AutoIt标准自定义函数的多线程函数,我写不出来,我现在没那水平。不过,至少我测试过了,测试了不下千次,测试用的方法不下20种,没一种方法成功。现在我水平还不到家,以后我可能会写出这样一个多线程的函数,但这需要时间来积累知识,我并不是在说能解决多线程问题的人一定会是我,我也希望有人能实现多线程。如果你还认为AU3支持多线程 简直就是天方夜谭,那可真是太out了,要知道古代的天方夜谭到今天都一一实现了,自不必说这是必然,正因为有人为此努力所以才能将近乎神话的事情变成必然的现实,不测试、不实践是永远也不会进步的。试问你在多线程方面,曾做过多少测试呢?~

drunk 发表于 2011-7-11 15:27:44

你可以调用命令行移动啊
run神马神马的

happytc 发表于 2011-7-11 15:27:56

这样楼主只需要
#Include <_MultiThread.au3>
就可以简单明了直接解决他提出的问题:
_MultiThread("checkfile", "source", "target")

user3000 发表于 2011-7-11 15:35:18

真是讨论出真知!希望AU3在这方面也能尽快得到补缺

happytc 发表于 2011-7-11 15:39:13

标题

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

个人觉得au3这种本身是单线程的设计思想
要实现不共享动态数据区的多线程应该比较容易点

leon460 发表于 2011-7-11 16:22:06

两位大哥,多谢了,虽然你们看的角度不一样,但是方向是一样的,呵呵

xrzmjz 发表于 2011-7-15 12:45:31

理论上来说
AU3也是可以支持多线程的
C语言通过调用DLL实现多线程
AU3同样可以通过调用DLL来实现多线程

hzxymkb 发表于 2011-7-15 14:51:18

路过,我不懂AU3,更不懂什么进程
{:face (229):}
页: [1] 2
查看完整版本: 函数调用怎样相互不影响[已解决]