-
Notifications
You must be signed in to change notification settings - Fork 2
/
workerThreadTasks.py
140 lines (127 loc) · 5.1 KB
/
workerThreadTasks.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# -*- coding: utf-8 -*-
# Falcon worker thread tasks
# Copyright (C) 2019 Yukio Nozawa <[email protected]>
# Note: All comments except these top lines will be written in Japanese.
"""
ワーカースレッドで実行されるタスクは、ここに並べます。
ワーカースレッドのタスクは、必ず taskState と param という辞書を引数にとり、それを使って処理します。
定期的に taskState.canceled プロパティをチェックして、 True になっていれば、処理を中断しなければなりません。その際には、 False を返します。処理を最後まで実行したら、 True を返す必要があります。
"""
import pathlib
import wx
import win32wnet
from win32com.shell import shell, shellcon
import globalVars
import misc
import time
import browsableObjects
def DirCalc(taskState, param):
"""
計算結果は(インデックス番号,バイト単位のサイズint値)で返る。
取得失敗時に-1となる場合があるので要注意
"""
lst = param['lst']
results = []
for elem in lst:
if taskState.canceled:
return False
s = misc.GetDirectorySize(elem[1])
results.append((elem[0], s))
# end 成功か失敗か
# end for
if taskState.canceled:
return False
wx.CallAfter(param['callback'], results, taskState)
return True
def GetRecursiveFileList(taskState, param):
"""
path から全てのフォルダを再帰的にたどって、ファイル名を out のリストに入れていく。なお、入る値は、 path からの相対パス。EOL=True にしておくと、ファイルリストを全部なめた段階で、eol という文字列をリストに追加してから終了する。検索終了の判定に使っている。
"""
out_lst = param['out_lst']
path = param['path']
for elem in misc.IteratePaths(path):
if taskState.canceled:
return False
out_lst.append(str(pathlib.Path(elem).relative_to(path)))
# end ファイルリストをガンガン入れる
if taskState.canceled:
return False
if param['eol']:
out_lst.append('eol')
return True
def PerformSearch(taskState, param):
"""
検索のバックグラウンド処理。listObject の検索メソッドを実行して、見つかった者を tabObject のほうに通知しながら、リアルタイムな検索結果表示を実現している。
"""
l = param['listObject']
t = param['tabObject']
while(True):
if taskState.canceled:
return False
finished, hits = l._performSearchStep(taskState)
if hits == -1:
return False # 検索処理からキャンセルで戻ってきた
if len(hits) > 0:
wx.CallAfter(t._onSearchHitCallback, hits, taskState)
if finished:
break # 全て検索した
time.sleep(0.1)
# end 検索ループ
return True
for elem in misc.IteratePaths(param['path']):
if taskState.canceled:
return False
def DebugBeep(taskState, param):
for i in range(10):
if taskState.canceled:
return False
globalVars.app.PlaySound("tip.ogg")
time.sleep(1)
# end for
return True
def GetNetworkResources(taskState=None, param=None):
# 同期処理でも呼び出し可能。パラメータ無しで呼ぶ。
sync_resources = []
try:
h = win32wnet.WNetOpenEnum(5, 1, 0, None)
# 5=RESOURCE_CONTEXT
# 1=RESOURCETYPE_DISK
lst = win32wnet.WNetEnumResource(h, 64) # 65以上の指定不可
win32wnet.WNetCloseEnum(h)
except win32net.error as er:
if taskState:
param["onFinish"](-1) # コールバックに通知
return True
else: # 同期処理
raise err
return None
# end 同期処理
# end 情報取得失敗
if taskState and taskState.canceled:
return False
lst.pop(0) # 先頭はドライブではない者が入るので省く
for l in lst:
ret, shfileinfo = shell.SHGetFileInfo(
l.lpRemoteName, 0, shellcon.SHGFI_ICON)
if taskState and taskState.canceled:
return False
addr = misc.ResolveLocalIpAddress(l.lpRemoteName[2:])
s = browsableObjects.NetworkResource()
s.Initialize(l.lpRemoteName[2:], l.lpRemoteName, addr, shfileinfo[0])
if taskState and taskState.canceled:
return False
sync_resources.append(s)
# end 同期処理
# end 追加ループ
if taskState and taskState.canceled:
return False
if taskState:
if taskState:
while(not param["isReady"]()):
time.sleep(0.3)
for s in sync_resources:
wx.CallAfter(param["onAppend"], s)
wx.CallAfter(param["onFinish"], len(lst))
return True
else:
return sync_resources