powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Виснет.. насмерть.
19 сообщений из 19, страница 1 из 1
Виснет.. насмерть.
    #38016515
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иногда виснет комп.
Делает это копирование, в качестве путей - расшареные диски на серверах в разных городах. В данном случае тянулось с Краснодара вБлаговещенск. Файлики маленькие 3 к байт в среднем.
=LOGER("Транспорт","Копируем",M.PUTHOUT,AR_FILEEXIST[M.III,1],M.FILETO,AR_FILEEXIST[M.III,1])
TRY
RENAME (M.PUTHOUT+AR_FILEEXIST[M.III,1]) TO (M.FILETO+AR_FILEEXIST[M.III,1])
FLUSH
DOEVENTS
CATCH
M.ERR=.T.
ENDTRY

вот не выходит из этой конструкции.. потому что есть далее тоже лог.

=LOGER("Транспорт","Скопирован",M.PUTHOUT,AR_FILEEXIST[M.III,1],M.FILETO,AR_FILEEXIST[M.III,1])

IF M.ERR
** БЛА БЛА
ENDIF

Мож есть че-нить более изящное?
...
Рейтинг: 0 / 0
Виснет.. насмерть.
    #38016569
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEv, а почему flush, а не flush force? Да и копирование делается с помощью copy file, а не rename.
Ну и в конце концов если у вас есть доступ к коду, пройдитесь отладкой и посмотрите, на каком именно операторе наступает зависание.
PS. Название топика напомнило: "I shall kill you.... with DEATH!" :)
...
Рейтинг: 0 / 0
Виснет.. насмерть.
    #38016665
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvИногда виснет комп.
...
Мож есть че-нить более изящное?
Windows очень плохо работает когда проблемы с доступом к носителям (try/catch не спасает в этом случае).
Для этого существуют другие "stateless" протоколы, например FTP, HTTP, sFTP etc...
Но в этом случае Вам самому надо будет организовать проверку, что файл успешно скопировался...
...
Рейтинг: 0 / 0
Виснет.. насмерть.
    #38017415
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Ch, привет!
Сергей, ты кусочек кода кинь, а то на меня эти "прАтаколы" грусть наводят.
Просто перенести файлик по сети хочется, а как устроено, че там внутри, как называется - пусть будет скрыто от меня. :)

Спасибо.
...
Рейтинг: 0 / 0
Виснет.. насмерть.
    #38017525
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
замени RENAME на COPY и DELETE

убери FLUSH с DOEVENTS - лишнее это, пишется сразу на диск, а чего родит DOEVENTS это похлеще макроподстановки. Если очень надо - запусти копирование в фоне отдельным процессом.

PS по хорошему правильно подсказывают - используй другие протоколы. Расшаренная папка в локалке хорошо, там излишний трафик незаметен. Для теста попробуй просто копировать свои маленькие файлы фарой или тоталом и посмотри скорость.
PPS Как вариант, если есть возможность, пакуй файлы на отправителе в один архив. Накладных расходов трафика меньше будет.
...
Рейтинг: 0 / 0
Виснет.. насмерть.
    #38017845
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvSergey Ch, привет!
Сергей, ты кусочек кода кинь, а то на меня эти "прАтаколы" грусть наводят.
Просто перенести файлик по сети хочется, а как устроено, че там внутри, как называется - пусть будет скрыто от меня. :)

Спасибо.
Готовых работающих примеров на FoxPro у меня, увы нет
Подобные вещи я пишу на .NET (там все для этого есть). Могу рассказать про архитектуру если интересно.

Как использовать FoxPro с FTP идеи можно взять отсюда (ссылка на английском).

Для HTTP можно использовать знакомые Вам WebServices (в свое время я просто передавал сразу готовые новые/измененные/удаленные записи на удаленные сервера а не файлы, хотя без проблем можно и сжатые файлы)...

Примерно так...
...
Рейтинг: 0 / 0
Виснет.. насмерть.
    #38019131
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tзамени RENAME на COPY и DELETE

убери FLUSH с DOEVENTS - лишнее это, пишется сразу на диск, а чего родит DOEVENTS это похлеще макроподстановки. Если очень надо - запусти копирование в фоне отдельным процессом.

PS по хорошему правильно подсказывают - используй другие протоколы. Расшаренная папка в локалке хорошо, там излишний трафик незаметен. Для теста попробуй просто копировать свои маленькие файлы фарой или тоталом и посмотри скорость.
PPS Как вариант, если есть возможность, пакуй файлы на отправителе в один архив. Накладных расходов трафика меньше будет.

Спасибо, Doevents ставлю чтобы индикатор показывал или как то еще можно? Flush уберу. Команды заменю. Файликов много .. один большой архив ваще не лезет. Мелкие лучше ходят. И ходят почти всегда хорошо, но иногда, аж сервак не пускает на себя зайти в терминале - виснет на Rename (логами проверил).
...
Рейтинг: 0 / 0
Виснет.. насмерть.
    #38019547
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvСпасибо, Doevents ставлю чтобы индикатор показывал или как то еще можно?
Doevents обрабатывает действия пользователя, если он чего мышкой тыкать начнет, то это начнет выполнятся.
Индикатор должен отрисовываться без Doevents. Можешь вставить wait ... window после каждого файлика и писать сколько штук осталось если известно.
MaestroEvFlush уберу. Команды заменю. Файликов много .. один большой архив ваще не лезет. Мелкие лучше ходят. И ходят почти всегда хорошо, но иногда, аж сервак не пускает на себя зайти в терминале - виснет на Rename (логами проверил).
Это говорит о том что связь между этими компами очень плохая. По хорошему переносить через 3-й сервер с быстрым инетом, т.е. отправитель выкладывает, получатель забирает.
В текущем варианте можешь попробовать отлавливать зависания. Засекай время перед копированием каждого файла, после проверяй. Если превысило предел - останавливай копирование.
Второй вариант - генерить батник для копирования и запускать его отдельным процессом, ждать определенное время и убивать процесс если время истекло, а он еще копирует. Только удаление в батник не пиши, т.к. удаление может сработать даже если копирование не сработает.
...
Рейтинг: 0 / 0
Виснет.. насмерть.
    #38019708
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опа.. обнаружился вопрос по doevents. Есть индикатор.. пусть даже написаный на Wait Window.
Без Doevents он не показывается !
В циклах - не хватает времени ему на прорисовку.
Кто и как прорисовает индикатор?
Есть другой индикатор на объекте - все тоже самое.. пока не вставляю в цикл Doevents - экран не меняется.
...
Рейтинг: 0 / 0
Виснет.. насмерть.
    #38019719
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, есть анализатор времени передачи. Не передаю и не тяну файлы если время больше 2 секунд, но вешается все, (если вешается), при первой попытке обращения..

Bat ник.. Ну можно и Батник попробовать.. А как этот процесс убивать из фокса?
...
Рейтинг: 0 / 0
Виснет.. насмерть.
    #38020042
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvBat ник.. Ну можно и Батник попробовать.. А как этот процесс убивать из фокса?
Класс waitexec
Код: sql
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.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
DEFINE CLASS waitexec AS custom
	Height = 15
	Width = 101
	HIDDEN nhandle
	nhandle = -1
	*-- Время в момент запуска
	HIDDEN nsecond
	nsecond = 0
	PROTECTED clasterror
	clasterror = "No error"
	nexitcode = -1
	Name = "clsexec"

	*-- Скрыть окно вызываемой программы.
	lhide = .F.


	HIDDEN PROCEDURE long2str
		LPARAMETERS tnlongval

		* Passed : 32-bit non-negative numeric value (m.longval)
		* Returns : ASCII character representation of passed
		*           value in low-high format (m.retstr)
		* Example :
		*    m.long = 999999
		*    m.longstr = long2str(m.long)

		local i, lсretstr

		lcretstr = ""
		FOR i = 24 TO 0 STEP -8
			lcretstr = CHR(INT(tnlongval/(2^i))) + lcretstr
			tnlongval = MOD(tnlongval, (2^i))
		NEXT
		RETURN lcretstr
	ENDPROC


	HIDDEN PROCEDURE str2long
		LPARAMETERS tclongstr

		* Passed:  4-byte character string (m.longstr)
		*   in low-high ASCII format
		* returns:  long integer value
		* example:
		*   m.longstr = "1111"
		*   m.longval = str2long(m.longstr)

		PRIVATE i, lnretval

		lnretval = 0
		FOR i = 0 TO 24 STEP 8
			lnretval = lnretval + (ASC(tclongstr) * (2^i))
			tclongstr = RIGHT(tclongstr, LEN(tclongstr) - 1)
		NEXT
		RETURN lnretval
	ENDPROC


	*-- Запуск указанного приложения. Параметр - полный путь к файлу. Возвращает .t. если выполнено
	PROCEDURE execute
		lpara tcExe, tnWaitToKill, tcWorkFolder
		* tcExe - командная строка для запуска
		* tnWaitToKill - время ожидания в секундах, по истечении TerminateProcess()
		* tcWorkFolder - рабочая папка, если не задана, то берется папка где расположен запускаемый EXE

		#DEFINE NORMAL_PRIORITY_CLASS 32
		#DEFINE IDLE_PRIORITY_CLASS 64
		#DEFINE HIGH_PRIORITY_CLASS 128
		#DEFINE REALTIME_PRIORITY_CLASS 1600

		this.nExitCode = -1

		local llRet, lcstart, lcprocess_info, lcPath, i

		this.Free()

		if this.lHide
			lcstart = this.long2str(68) + REPLICATE(CHR(0), 40) + this.long2str(1) + REPLICATE(CHR(0), 20)
		else
			lcstart = this.long2str(68) + REPLICATE(CHR(0), 64)
		endif
		lcprocess_info = REPLICATE(CHR(0), 16)

		if !empty(tcWorkFolder)
			lcPath = tcWorkFolder
		else
			lcPath = alltrim(tcExe)
			if left(lcPath, 1) = '"'
				lcPath = substr(lcPath, 2)
				if at('"', lcPath) != 0
					lcPath = left(lcPath, at('"', lcPath))
				endif
			else
				if at(' ', lcPath) != 0
					lcPath = left(lcPath, at(' ', lcPath))
				endif
			endif
			lcPath = addbs(justpath(lcPath))
			if left(tcExe, 1) = '"' and at('"', tcExe, 2) = len(tcExe)
				* Убирание лишних кавычек
				tcExe = substr(tcExe, 2)
				tcExe = Left(tcExe, len(tcExe) - 1)
			endif
		endif

		if empty(lcPath)
			lcPath = addbs(fullpath(''))
		endif

		if CreateProcess(0, tcExe, 0, 0, 0, NORMAL_PRIORITY_CLASS, 0, lcPath, @lcstart, @lcprocess_info) = 0
			llRet = .f.
			this.nHandle = -1
			this.cLastError = 'Не удалось выполнить ' + tcExe
		else
			this.nHandle = this.str2long(SUBSTR(lcprocess_info, 1, 4))
			this.nSecond = second()
			if empty(tnWaitToKill)
				llRet = .t.
			else
				for i = 1 to tnWaitToKill
					if this.WaitStop(1000)
						exit
					endif
				endfor
				if this.nHandle = -1
					llRet = .t.
				else
					this.Killprocess()
					llRet = .f.
					this.cLastError = 'Истекло время выполнения (' + astr(tnWaitToKill) + ' сек.) ' + tcExe
				endif
			endif
		endif

		return llRet
	ENDPROC


	*-- Ожидание завершения работы приложения. Параметр - время ожидания в мс, если не указан, то ждать до конца. Возвращает .t. если завершено.
	PROCEDURE waitstop
		#DEFINE WAIT_TIMEOUT 0x00000102

		lpara tnTime

		local llRet, llCircle, lnExitCode

		if vartype(tnTime) != 'N'
			tnTime = 200
			llCircle = .t.
		endif

		if this.nHandle != -1
			do while .t.
				IF WaitForSingleObject(this.nHandle, tnTime) != WAIT_TIMEOUT
					llRet = .t.
					lnExitCode = -2
					if GetExitCodeProcess(this.nHandle, @lnExitCode) > 0
						this.nExitCode = lnExitCode
					endif
					this.Free()
					exit
				else
					if !llCircle
						exit
					endif
				ENDIF
			enddo
		else
			llRet = .t.
		endif

		return llRet
	ENDPROC


	*-- Отказ от контроля за запущенным процессом.
	PROCEDURE free
		if this.nHandle != -1
			CloseHandle(this.nHandle)
			this.nHandle = -1
		endif
	ENDPROC


	*-- Время, которое программа работает с момента запуска, в секундах.
	PROCEDURE getworkingtime
		return second() - this.nSecond
	ENDPROC


	PROCEDURE killprocess
		if this.nHandle != -1
			TerminateProcess(this.nHandle, 0)
			this.Free()
		endif
	ENDPROC


	*-- Получение описания последней ошибки
	PROCEDURE getlasterror
		return this.cLastError
	ENDPROC


	PROCEDURE getexitcode
		return this.nExitCode
	ENDPROC


	PROCEDURE Destroy
		this.Free()
	ENDPROC


	PROCEDURE Init
		if type('glDeclareCreateProcess') = 'U'
			public glDeclareCreateProcess
			DECLARE INTEGER CreateProcess IN kernel32.DLL ;
			     INTEGER lpApplicationName, ;
			     STRING lpCommandLine, ;
			     INTEGER lpProcessAttributes, ;
			     INTEGER lpThreadAttributes, ;
			     INTEGER bInheritHandles, ;
			     INTEGER dwCreationFlags, ;
			     INTEGER lpEnvironment, ;
			     STRING @lpCurrentDirectory, ;
			     STRING @lpStartupInfo, ;
			     STRING @lpProcessInformation

			DECLARE INTEGER WaitForSingleObject IN kernel32.DLL ;
			     INTEGER hHandle, INTEGER dwMilliseconds

			DECLARE INTEGER CloseHandle IN kernel32.DLL ;
			     INTEGER hObject

			DECLARE INTEGER GetLastError IN kernel32.DLL

			DECLARE INTEGER TerminateProcess IN kernel32.DLL INTEGER, INTEGER

			DECLARE INTEGER GetExitCodeProcess IN kernel32.DLL INTEGER hProcess, INTEGER @dwExitCode
		endif
	ENDPROC
ENDDEFINE


В простейшем случае использовать так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
loWEx = NewObject('waitexec')
*loWEx.lHide = .T. && если надо спрятать окно консольной проги
if loWEx.Execute('c:\batnik.cmd') && Запускаем
   if !loWEx.WaitStop(1000) && Пауза в мс, если процесс закончится раньше - вернет .T.
      * Время истекло, убиваем
      loWEx.KillProcess()
   endif
endif
...
Рейтинг: 0 / 0
Виснет.. насмерть.
    #38020250
Reese
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати, можно еще попробовать копировать через WshShell
Вот неплохая дока по нему http://www.script-coding.com/WSH/WshShell.html
...
Рейтинг: 0 / 0
Виснет.. насмерть.
    #38020265
Reese
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не туда ссылку дал.
вот http://www.script-coding.com/WSH.html
Обратите внимание на следующие методы:
WshShell.Run - запуск программы с ожиданием завершения + можно скрыть окно.
FileSystemObject - тут все методы хороши. Встроенными фоксовыми я уже и не пользуюсь.
...
Рейтинг: 0 / 0
Виснет.. насмерть.
    #38020380
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ReeseНе туда ссылку дал.
вот http://www.script-coding.com/WSH.html
Обратите внимание на следующие методы:
WshShell.Run - запуск программы с ожиданием завершения + можно скрыть окно.
FileSystemObject - тут все методы хороши. Встроенными фоксовыми я уже и не пользуюсь.
WshShell пробовал как-то, с батником он не заработал, правда долго не разбирался.
FileSystemObject - там только работа с файлами и папками. Запуска там нет.
...
Рейтинг: 0 / 0
Виснет.. насмерть.
    #38020723
Reese
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to DimaT
Да не обращай внимания. Очередной решивший что все знает, хотя даже не прочитал о чем речь.

По поводу WshShell. Я часто этим пользуюсь. Там все просто

Код: vbnet
1.
2.
lo_WshShell = CreateObject("WScript.Shell")
lo_WshShell .Run("c:\test.bat", 0, .F.)


Будет ждать пока test.bat завершит работу.

А FileSystemObject - это я про то что в самом начале спрашивалось, про более изящное решение. Насколько помню, надо будет только в try обернуть.
...
Рейтинг: 0 / 0
Виснет.. насмерть.
    #38020999
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В простейшем случае использовать так:
loWEx = NewObject('waitexec')
*loWEx.lHide = .T. && если надо спрятать окно консольной проги
if loWEx.Execute('c:\batnik.cmd') && Запускаем
if !loWEx.WaitStop(1000) && Пауза в мс, если процесс закончится раньше - вернет .T.
* Время истекло, убиваем
loWEx.KillProcess()
endif
endif

Спасибо, а почему бы сразу вместо батника не запускать строку ДОСа: Move /Y бла бла и убивать этот процесс если он дольше 1 минуты?
Как адатпировать Ваш класс для выполнения внутренних команд Доса?
...
Рейтинг: 0 / 0
Виснет.. насмерть.
    #38021047
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaestroEvСпасибо, а почему бы сразу вместо батника не запускать строку ДОСа: Move /Y бла бла и убивать этот процесс если он дольше 1 минуты?
Команды доса выполняет CMD.EXE
Код: sql
1.
2.
3.
4.
5.
if loWEx.Execute('cmd.exe /c move /y ' + M.PUTHOUT+AR_FILEEXIST[M.III,1] + ' ' + M.FILETO+AR_FILEEXIST[M.III,1])
   if !loWEx.WaitStop(60000) && Ожидание 1 минуту
      * Время истекло, убиваем
      loWEx.KillProcess()
   ...


Если в путях пробелы есть, то в двойные кавычки имена файлов надо взять.
...
Рейтинг: 0 / 0
Виснет.. насмерть.
    #38021057
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если именно в таком виде будешь пользоваться то можно проще писать:
Код: sql
1.
2.
3.
4.
5.
if !loWEx.Execute('cmd.exe ...', 60)
	? loWEx.GetLastError()
else
	? 'Скопировалось'
endif


у Execute() второй параметр время ожидания в секундах. Третий - рабочая папка запускаемого процесса.
...
Рейтинг: 0 / 0
Виснет.. насмерть.
    #38040841
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!!!
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Виснет.. насмерть.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]