|
共通化.uwsという多数のprocedureを入力されているファイルがあります。 callで共通化.uwsを呼び出してCOMMON.でTHREADで呼び出したいのですがどうすればいいでしょうか? COMMON.THREAD 奇数(リンク一覧,Pattern)だとうまくできません。
call C:\Users\aruke\Desktop\共通化.uws
Dim res1 = COMMON.THREAD 奇数(リンク一覧,Pattern)
|
No.4550 2017/10/18(Wed) 10:32:35
|
☆ Re: callでユーザー関数読込COMMON.のTHREADで呼び出す方法 / stuncloud |
|
|
COMMON というのはModule(またはClass)のことですよね それで 奇数() がその中の関数ですかね? その場合のthread呼び出しは
thread COMMON.奇数(リンク一覧, Pattern)
となります またthreadだと戻り値を受けることはできず、var変数を定義しても値を返しません なので
module COMMON public 奇数result = EMPTY
procedure 奇数(foo, bar) //処理 奇数result = 結果 fend endmodule
のように定義して COMMON.奇数result を介して結果の値を受け取る感じになります ただし COMMON.奇数() の処理が 奇数result に値を代入するところまで進んでいないと COMMON.奇数result はEMPTYしか返さないので、そこはループで待機するなりするなどの工夫をしてください
|
No.4551 2017/10/18(Wed) 12:30:50
|
|
☆ Re: callでユーザー関数読込COMMON.のTHREADで呼び出す方法 / さやか |
|
|
stuncloud様、返信ありがとうございます。 thread COMMON.奇数(リンク一覧, Pattern)でスレッドはうまくできました。 最終的にしたい処理がCOMMONで呼び出した配列を使用したいのですがうまくできません。
1であれば結果がaと表示される。 2だとha1aaが定義されていませんと表示される 2ケースで結果がaと表示させる方法ないでしょうか?
1、 call C:\Users\aruke\Desktop\_共通化.uws THREAD tete() print ha1aa[0]
procedure tete() public ha1aa[2]="a","b","c" Fend
2、 call C:\Users\aruke\Desktop\ショットカット構文一覧\00_共通化.uws THREAD COMMON.tete() print ha1aa[0]
C:\Users\aruke\Desktop\ショットカット構文一覧\00_共通化.uwsには下記が入力されている。
CLASS COMMON
procedure tete() public ha1aa[2]="a","b","c" Fend
endCLASS
|
No.4552 2017/10/18(Wed) 14:50:12
|
|
☆ Re: callでユーザー関数読込COMMON.のTHREADで呼び出す方法 / stuncloud |
|
|
print COMMON.ha1aa[0]
ちなみに > public ha1aa[2]="a","b","c" の部分はpublicが付いてるのでスクリプト実行のわりと最初の方で宣言されます COMMON.tete()を呼ぶ必要すらないです
print COMMON.ha1aa[0]
CLASS COMMON public ha1aa[2]="a","b","c" endCLASS
つまりこう書くのとほぼ同じです 1のケースも同様にtete()を呼ぶ必要がないです
なんかいろいろと筋が悪そうですね そもそもthreadが必要かどうかもあやしい 何がしたいのかわからないのでなんとも言えませんが…
あえてこの方向でやるとしたら
print length(COMMON.ha1aa) // この時点で配列の長さ0 THREAD COMMON.tete()
repeat sleep(0.1) until length(COMMON.ha1aa) > 0
print COMMON.ha1aa[0] // threadで呼んだCOMMON.tete()が配列を代入する処理が終わったらprintする
CLASS COMMON public ha1aa = safearray(0, -1) // 長さ0の配列(SafeArray)を宣言しておく
procedure tete() sleep(1) ha1aa = split("a b c") // 関数内で変数に配列(SafeArray)を代入 fend endCLASS
こんな感じになると思います UWSCの配列変数は後から任意のサイズと値を代入するのは骨が折れるので扱いの楽なSafeArrayを使っています COMMON.tete()の処理が終わって初めてCOMMON.ha1aaから値を読み出せます
# 僕ならこんな実装にはしませんが
|
No.4557 2017/10/18(Wed) 18:36:35
|
|
☆ Re: callでユーザー関数読込COMMON.のTHREADで呼び出す方法 / さやか |
|
|
print COMMON.ha1aa[0]で処理できるとは考えもつきませんでした。
やっている処理としては、リンク一覧にあるリンクにアクセス、正規表現でデータ抽出し、それを偶数番号のリンクはaという配列に奇数番号のリンクはbという配列にいれて、それをa配列とb配列を統合しファイルに出力するという処理です。
00_共通化.uwsにあるpublic ha2[5]とpublic ha1a[5]の[]の中の5を、正規表現でデータ抽出が6回あるから5としているのですが、この数字をいれずにpublic ha2[]のような任意の形でするとエラーになります。
この数字はやはりいれて置く必要があるのでしょうか?
下記がスクリプトです。 call C:\Users\aruke\Desktop\ショットカット構文一覧\00_共通化.uws
出力ファイル="C:\Users\aruke\Desktop\adj.txt" リンク一覧="C:\Users\aruke\Desktop\リンク一覧.txt" Pattern="<span class=<#DBL>number<#DBL>"
textblock area1 北海道:東北:関東:東海:北信越:関西: endtextblock
Public regvb=CREATEOLEOBJ("VBScript.RegExp")
THREAD COMMON.偶数取得(出力ファイル,リンク一覧,area1,Pattern)
SLEEP(2.0)
COMMON.奇数取得(リンク一覧,area1,Pattern)
fid=fopen(出力ファイル, F_WRITE) for i = 0 to length(COMMON.ha2)-1 if i = 0 then fput(fid,COMMON.ha1a[i]+"<#CR>"+COMMON.ha2[i],-2) else fput(fid,COMMON.ha1a[i]+"<#CR>"+COMMON.ha2[i]) endif next fclose(fid)
Function regvb_Execute(str, Pattern, IgnoreCase=TRUE, Global=TRUE) regvb.IgnoreCase=IgnoreCase regvb.Global=Global regvb.Pattern=Pattern Matches=regvb.Execute(str) Result=Matches Fend --------------------- C:\Users\aruke\Desktop\ショットカット構文一覧\00_共通化.uwsには下記のスクリプト。
CLASS COMMON procedure 奇数取得(リンク一覧,area1,Pattern) call C:\Users\aruke\Desktop\ショットカット構文一覧\00_共通化.uws
//配列カウント hi=0 Dim res = COMMON.test_hairetu(リンク一覧) public ha2[5]
Dim hai_area1 =SPLIT(area1,":")
FOR i = 1 TO length(res) -1 STEP 2 //1 3 5 TRY IE1 = CREATEOLEOBJ("InternetExplorer.Application") EXCEPT EXEC("C:\Program Files\Internet Explorer\iexplore.exe") IE1 = GETACTIVEOLEOBJ("InternetExplorer.Application") ENDTRY IE1.visible = true
IE1.navigate(res[i])
SLEEP(0.5) ClkItem(GetID("Windows", "#32770", 1), "OK") ClkItem(GetID("Windows", "#32770", 1), "このページから移動") ClkItem(GetID("Windows", "#32770", 1), "プログラムを終了します") ClkItem(GetID("Windows", "#32770", 1), "プログラムを再起動します") ClkItem(GetID("ページからのメッセージ", "#32770", 1), "OK") ClkItem(GetID("ページからのメッセージ", "#32770", 1), "このページから移動") ClkItem(GetID("ページからのメッセージ", "#32770", 1), "プログラムを終了します") ClkItem(GetID("ページからのメッセージ", "#32770", 1), "プログラムを再起動します") CONST TIME_OUT = 60 tm = Gettime() REPEAT SLEEP(1) ifb Gettime() - tm > TIME_OUT break endif UNTIL (! IE1.BUSY) AND (IE1.READYSTATE=4) SLEEP(0.5) id = hndtoid(IE1.hwnd) SLEEP(0.5)
文字列全体=IE1.document.body.innerhtml Public regvb=CREATEOLEOBJ("VBScript.RegExp")
Matches=regvb_Execute(文字列全体, Pattern)
ha2[hi]=hai_area1[i]+":"+val(Matches.Item(0).SubMatches(0)) IE1.quit hi=hi+1 NEXT fend
procedure 偶数取得(出力ファイル,リンク一覧,area1,Pattern) call C:\Users\aruke\Desktop\ショットカット構文一覧\00_共通化.uws
Dim hai = COMMON.test_hairetu(リンク一覧) public ha1a[5]
//配列カウント hi=0
Dim hai_area =SPLIT(area1,":")
FOR y = 0 TO length(hai)-1 STEP 2 //0 2 4
TRY IE = CREATEOLEOBJ("InternetExplorer.Application") EXCEPT EXEC("C:\Program Files\Internet Explorer\iexplore.exe") IE = GETACTIVEOLEOBJ("InternetExplorer.Application") ENDTRY IE.visible = true IE.navigate(hai[y])
SLEEP(0.5) ClkItem(GetID("Windows", "#32770", 1), "OK") ClkItem(GetID("Windows", "#32770", 1), "このページから移動") ClkItem(GetID("Windows", "#32770", 1), "プログラムを終了します") ClkItem(GetID("Windows", "#32770", 1), "プログラムを再起動します") ClkItem(GetID("ページからのメッセージ", "#32770", 1), "OK") ClkItem(GetID("ページからのメッセージ", "#32770", 1), "このページから移動") ClkItem(GetID("ページからのメッセージ", "#32770", 1), "プログラムを終了します") ClkItem(GetID("ページからのメッセージ", "#32770", 1), "プログラムを再起動します") CONST TIME_OUT = 60 tm = Gettime() REPEAT SLEEP(1) ifb Gettime() - tm > TIME_OUT break endif UNTIL (! IE.BUSY) AND (IE.READYSTATE=4) SLEEP(0.5) id = hndtoid(IE.hwnd) SLEEP(0.5)
文字列全体=IE.document.body.innerhtml
Public regvb=CREATEOLEOBJ("VBScript.RegExp")
file1 = FOPEN(出力ファイル, F_READ or F_WRITE8 or F_NOCR)
Matches=regvb_Execute(文字列全体, Pattern)
ha1a[hi]=hai_area[y]+":"+Matches.Item(0).SubMatches(0) IE.quit hi=hi+1 next fend
procedure 奇数取得(リンク一覧,area1,Pattern) call C:\Users\aruke\Desktop\ショットカット構文一覧\00_共通化.uws
//配列カウント hi=0 Dim res = COMMON.test_hairetu(リンク一覧) public ha2[5]
Dim hai_area1 =SPLIT(area1,":")
FOR i = 1 TO length(res) -1 STEP 2 //1 3 5 TRY IE1 = CREATEOLEOBJ("InternetExplorer.Application") EXCEPT EXEC("C:\Program Files\Internet Explorer\iexplore.exe") IE1 = GETACTIVEOLEOBJ("InternetExplorer.Application") ENDTRY IE1.visible = true
IE1.navigate(res[i])
SLEEP(0.5) ClkItem(GetID("Windows", "#32770", 1), "OK") ClkItem(GetID("Windows", "#32770", 1), "このページから移動") ClkItem(GetID("Windows", "#32770", 1), "プログラムを終了します") ClkItem(GetID("Windows", "#32770", 1), "プログラムを再起動します") ClkItem(GetID("ページからのメッセージ", "#32770", 1), "OK") ClkItem(GetID("ページからのメッセージ", "#32770", 1), "このページから移動") ClkItem(GetID("ページからのメッセージ", "#32770", 1), "プログラムを終了します") ClkItem(GetID("ページからのメッセージ", "#32770", 1), "プログラムを再起動します") CONST TIME_OUT = 60 tm = Gettime() REPEAT SLEEP(1) ifb Gettime() - tm > TIME_OUT break endif UNTIL (! IE1.BUSY) AND (IE1.READYSTATE=4) SLEEP(0.5) id = hndtoid(IE1.hwnd) SLEEP(0.5)
文字列全体=IE1.document.body.innerhtml Public regvb=CREATEOLEOBJ("VBScript.RegExp")
Matches=regvb_Execute(文字列全体, Pattern)
ha2[hi]=hai_area1[i]+":"+val(Matches.Item(0).SubMatches(0)) IE1.quit hi=hi+1 NEXT fend
procedure 偶数取得(出力ファイル,リンク一覧,area1,Pattern) call C:\Users\aruke\Desktop\ショットカット構文一覧\00_共通化.uws
Dim hai = COMMON.test_hairetu(リンク一覧) public ha1a[5]
//配列カウント hi=0
Dim hai_area =SPLIT(area1,":")
FOR y = 0 TO length(hai)-1 STEP 2 //0 2 4
TRY IE = CREATEOLEOBJ("InternetExplorer.Application") EXCEPT EXEC("C:\Program Files\Internet Explorer\iexplore.exe") IE = GETACTIVEOLEOBJ("InternetExplorer.Application") ENDTRY IE.visible = true IE.navigate(hai[y])
SLEEP(0.5) ClkItem(GetID("Windows", "#32770", 1), "OK") ClkItem(GetID("Windows", "#32770", 1), "このページから移動") ClkItem(GetID("Windows", "#32770", 1), "プログラムを終了します") ClkItem(GetID("Windows", "#32770", 1), "プログラムを再起動します") ClkItem(GetID("ページからのメッセージ", "#32770", 1), "OK") ClkItem(GetID("ページからのメッセージ", "#32770", 1), "このページから移動") ClkItem(GetID("ページからのメッセージ", "#32770", 1), "プログラムを終了します") ClkItem(GetID("ページからのメッセージ", "#32770", 1), "プログラムを再起動します") CONST TIME_OUT = 60 tm = Gettime() REPEAT SLEEP(1) ifb Gettime() - tm > TIME_OUT break endif UNTIL (! IE.BUSY) AND (IE.READYSTATE=4) SLEEP(0.5) id = hndtoid(IE.hwnd) SLEEP(0.5)
文字列全体=IE.document.body.innerhtml
Public regvb=CREATEOLEOBJ("VBScript.RegExp")
file1 = FOPEN(出力ファイル, F_READ or F_WRITE8 or F_NOCR)
Matches=regvb_Execute(文字列全体, Pattern)
ha1a[hi]=hai_area[y]+":"+Matches.Item(0).SubMatches(0) IE.quit hi=hi+1 next fend
endCLASS
|
No.4559 2017/10/18(Wed) 21:59:37
|
|
☆ Re: callでユーザー関数読込COMMON.のTHREADで呼び出す方法 / stuncloud |
|
|
話題が変わっています threadについては解決していると思いますので、ここらで打ち切ってください
それと、質問に付随してコードを書く場合は質問の内容に沿ったものだけにしてください 質問内容に関係のない部分も含めたコードを長々と書かれても困ります 正直これを読み解くことに労力を割きたくありません (なので読んでません)
あとはちょっとだけヒントです 配列変数はひとまず適当なサイズで宣言しておいて、あとからサイズを変更できます これを踏まえた上で希望の実装ができない場合は改めて質問スレッドを建ててください
public 配列[-1] print length(配列) // この時点では長さ0
配列にデータを格納()
for data in 配列 print data next
procedure 配列にデータを格納() 配列サイズ = 配列に入るデータ数() // 配列サイズを変更する、配列サイズではなく添字の最大値を指定することに注意 resize(配列, 配列サイズ - 1) for i = 0 to 配列サイズ - 1 配列[i] = 配列に入るデータ(i) next fend
|
No.4560 2017/10/19(Thu) 10:09:21
|
|
☆ Re: callでユーザー関数読込COMMON.のTHREADで呼び出す方法 / さやか |
|
|
stuncloud様、大変失礼しました。教えて頂きましたコードで考えてみます。 ありがとうございました。
|
No.4561 2017/10/19(Thu) 11:32:02
|
|