Что нового

Одновременное использование Excel несколькими скриптами для хранения данных.

valdur2000

Знающий
Сообщения
155
Репутация
7
Здравствуйте, использую Excel, как базу данных, откуда скрипт берет их построчно и вставляет в IE форму. затем снова открывает Excel и пишет в него репорт, что очередная строка данных отработана. Теперь хочу одновременно запустить несколько скриптов. Несколько скриптов запускаются только в откомпилированном виде (а может я чего-то не умею?), а значит поиск ошибок становится очень трудным. Задача избежать конфликта обращения к файлу Excel.
я написал вот такую функцию:
Код:
Func _ExcelBookOpenEx($File)
	While ProcessExists("EXCEL.exe")
		Sleep(500)
	WEnd
;$oExcel = _ExcelBookOpen($File,0)
$oExcel = _ExcelBookOpen("C:\AutoIt\vrabote\ara.xls",0)
_ExcelSheetActivate($oExcel,1)
Return $oExcel
EndFunc

которая используется в каждом скрипте вместо _ExcelBookOpen. после отработки, xls закрывается другой функцией:
Код:
Func _ExcelBookCloseEx($oExcel)
While ProcessExists($oExcel)
	Sleep(100)
	ProcessClose($oExcel)
	Sleep(1000)
WEnd
EndFunc

Работает все, но хромает, частые ошибки, а я из-за откомпилированности не могу толком определить откуда. Может есть у кого опыт одновременной работы нескольких скриптов с excel? или может администраторы увидят, чем можно мои функции подправить? Спасибо.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Да, несколько скриптов запускаются только в откомпилированном виде.
Когда я прибегал к такой схеме (и excel тут ни при чем), то использовал CapsLock как семафор (хотя можно использовать и что-то другое - файл какой-нибудь, например).
Каждый скрипт, когда ему нужно что-то сделать с общими ресурсами,
1. Проверяет включен ли семафор.
2. Если семафор включен, то ждет пока он выключится.
3. Если семафор выключен, то
3.1. Включает семафор.
3.2. Производит действия над общими ресурсами.
3.3. Выключает семафор.
 
Автор
V

valdur2000

Знающий
Сообщения
155
Репутация
7
Код:
#include <WinAPIEx.au3>
                
$hSemaphore = _WinAPI_CreateSemaphore('Excel', 1, 1) ;создал семафор под названием "Excel"
_WinAPI_WaitForSingleObject($hSemaphore)
		
$oExcel = _ExcelBookOpen($File,0) ;открыл Excel, записал туда инфу, сохранил, закрыл.
_ExcelSheetActivate($oExcel,1)
_ExcelWriteCell($oExcel,$date,$i,14)
_ExcelBookSave($oExcel)
_ExcelBookClose($oExcel)
$oExcel = 0
		
_WinAPI_ReleaseSemaphore($hSemaphore) ;удалил семафор
_WinAPI_CloseHandle($hSemaphore)


Такие блоки создания/удаления семафора вставляю при любом обращении к excel во всех одновременно выполняемых скриптах. Работает как часики.
 
Верх