Войти

Показать полную графическую версию : [решено] Независимый/паралельный запуск функции от работы скрипта


---Zak---
17-09-2010, 10:57
День добрый... Подскажите плиз куда копать - ситуация следующая:
Необходимо создать программу, которая будет висеть в трее и по нажатии правой кнопки выкидывать меню, то мне так же необходимо параллельно запустить функцию, которая будет читать из файла данные и если что делать изменения ручками.

Нашел похожую тему: http://forum.oszone.ru/post-1397936.html, но там ставиться форма и кнопка на ней висит... поковыряв ее - ничего не получилось... сижу ломаю голову до сих пор. Меню создается и файл читается, но при выборе (в данном примере) блокнота - он не открывается... и выход не срабатывает.

Свой кусок прилагаю ниже...


#NoTrayIcon
#include <ModernMenuRaw.au3>

$hTrayIcon = _TrayIconCreate("Proba")

_TrayIconSetClick(-1, 16)
_TrayIconSetState()

$nTrayMenu = _TrayCreateContextMenu()

$Notepad_TrayItem = _TrayCreateItem("Блокнот")
_TrayItemSetIcon(-1, "notepad.exe", 0)

_TrayCreateItem("")
_TrayItemSetIcon(-1, "", 0)

$Exit_TrayItem = _TrayCreateItem("Выход")
_TrayItemSetIcon(-1, "shell32.dll", 28)

_SetTrayIconBkColor(0xC46200)
_SetTraySelectBkColor(0x087272)
_SetTraySelectTextColor(0xFFFFFF)

AdlibRegister("ReadFILE", 1000)

While 1
Switch GUIGetMsg()
Case $Notepad_TrayItem
AdlibUnRegister()
Run("Notepad.exe")
Case $Exit_TrayItem
_TrayIconDelete($hTrayIcon)
ExitLoop
EndSwitch
WEnd

Func ReadFILE()
$file = FileOpen("C:\proba.txt", 0)
While 1
$line = FileReadLine($file)
If @error = -1 Then ExitLoop
;~ ........
WEnd
FileClose($file)
EndFunc ;==>

madmasles
17-09-2010, 11:29
---Zak---,
Честно говоря, я не совсем понял, что Вам надо, но попробуйте так, у меня работает: #NoTrayIcon
#include <ModernMenuRaw.au3>
$j = 0
$bPause = True
$hTrayIcon = _TrayIconCreate("Proba")

_TrayIconSetClick(-1, 16)
_TrayIconSetState()

$nTrayMenu = _TrayCreateContextMenu()

$Pause_TrayItem = _TrayCreateItem("Пауза")
_TrayItemSetIcon(-1, "shell32.dll", 321)

_TrayCreateItem("")
_TrayItemSetIcon(-1, "", 0)

$Notepad_TrayItem = _TrayCreateItem("Блокнот")
_TrayItemSetIcon(-1, "notepad.exe", 0)

_TrayCreateItem("")
_TrayItemSetIcon(-1, "", 0)

$Exit_TrayItem = _TrayCreateItem("Выход")
_TrayItemSetIcon(-1, "shell32.dll", 28)

_TrayIconSetToolTip(-1, 'Функции работают')
_SetTrayIconBkColor(0xC46200)
_SetTraySelectBkColor(0x087272)
_SetTraySelectTextColor(0xFFFFFF)

AdlibRegister("ReadFILE", 1000)
AdlibRegister("_MyPing", 1000)
While 1
Switch GUIGetMsg()
Case $Notepad_TrayItem
Run("Notepad.exe офис.txt")
Case $Pause_TrayItem
$bPause = Not $bPause
If $bPause Then
AdlibRegister("ReadFILE", 1000)
AdlibRegister("_MyPing", 1000)
_TrayItemSetText($Pause_TrayItem, 'Пауза')
_TrayItemSetIcon($Pause_TrayItem, "shell32.dll", 321)
_TrayIconSetToolTip(-1, 'Функции работают')
Else
AdlibUnRegister("ReadFILE")
AdlibUnRegister("_MyPing")
_TrayItemSetText($Pause_TrayItem, 'Продолжить')
_TrayItemSetIcon($Pause_TrayItem, "shell32.dll", 135)
_TrayIconSetToolTip(-1, 'Пауза в работе функций')
EndIf

Case $Exit_TrayItem
_TrayIconDelete($hTrayIcon)
ExitLoop
EndSwitch
WEnd

Func ReadFILE()
$file = FileOpen("офис.txt", 0)
While 1
$line = FileReadLine($file)
If @error = -1 Then ExitLoop
;~ ........
WEnd
FileClose($file)
$j += 1
ToolTip('Счетчик ' & $j, 0, 0)
EndFunc ;==>ReadFILE
Func _MyPing()
Local $iPing = Ping('google.com')
If $iPing Then
_TrayTip(-1, 'Ping', 'Ping google.com - ' & $iPing & ' ms' & @CRLF & $j, 0, 19)
Else
_TrayTip(-1, 'Ping', 'No Ping google.com - ' & $j, 0, 19)
EndIf
EndFunc ;==>_MyPing

---Zak---
17-09-2010, 11:48
madmasles, спасибки огромное, переделаю под себя =)... сейчас объясню другими словами что требуется, если интересно.

Необходимо создать программу, которая висит в трее и при нажатии правой кнопкой по ней - вылезает меню. Допустим запуск блокнота и выход.
А параллельно этому должен запускаться процесс по чтению данных из файла, который никакого отношения к меню не имеет. И чтобы не грузить ПК чтение файла запускается через некоторое время - допустим через 60 сек (в последующем время увеличим)

Ну можно сделать по другому (я уже переделаю под себя)
Пишет тот же самый трей с менюшкой из блокнота и выходом, а параллельно этому запускается функция, в которой пингуется ПК (192.168.1.1) и если пинга нет, то вывести сообщение.

madmasles
17-09-2010, 12:47
---Zak---,
Я поменял код в своем предыдущем сообщении. У меня обе функции работают. Если Вам надо запускать функции с разным интервалом, то посмотрите здесь (http://forum.oszone.net/post-1489661.html#post1489661).

---Zak---
17-09-2010, 12:48
Все - спс... переписал все с нуля и заработала как часы. С меня пива =)

Да не - все норм... у меня почему-то при чтении файла функция просто зависала и дальше не срабатывала.

Creat0R
17-09-2010, 14:20
---Zak---,
Предупреждение за нарушение правил форума, пункт 2.7 (http://forum.oszone.net/rules.html#2.7):

В заголовке темы обязательно обозначайте название предмета, которого касается вопрос, а в теле сообщения максимально подробно опишите проблему (приведите аппаратную/программную конфигурацию, а также изложите ситуацию, в которой возникает проблема). Темы с несодержательными или слишком общими заголовками будут закрываться или переноситься в раздел "Зона тестирования" в зависимости от политики конкретного форума. Подробнее о принципах создания тем читайте в этом документе (http://forum.oszone.net/faq.php?faq=vb_read_and_post#faq_thread) и Правилах форумов.

Переименуйте пожалуйста тему.




© OSzone.net 2001-2012