Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PowerBuilder Новый топик    Ответить
 Multithread  [new]
Riska
Member

Откуда: Израиль
Сообщений: 985
Драсьте!

Задача: нужно остановить через какое-то время длинный процесс.
Пытаюсь сделать так:
forward
global type nvuo_timer from timing
end type
end forward

global type nvuo_timer from timing
end type
global nvuo_timer nvuo_timer

type variables
string		is_command
window	iw_window
end variables

event timer;integer li_ret

Stop()

CHOOSE CASE is_command
	CASE 'STOP SELECT'
		iw_window.Triggerevent('ue_stop_select')
	CASE 'START SELECT'
		iw_window.Triggerevent('ue_start_select')
END CHOOSE

end event

on nvuo_timer.create
call super::create
TriggerEvent( this, "constructor" )
end on

on nvuo_timer.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on


forward
global type w_multithread from window
end type
type cb_1 from commandbutton within w_multithread
end type
type st_1 from statictext within w_multithread
end type
end forward

global type w_multithread from window
integer x = 247
integer y = 224
integer width = 928
integer height = 336
boolean titlebar = true
string title = "Multi-Threading with PowerBuilder"
boolean controlmenu = true
boolean minbox = true
boolean maxbox = true
boolean resizable = true
long backcolor = 77652192
event ue_start_select ( )
event ue_stop_select ( )
cb_1 cb_1
st_1 st_1
end type
global w_multithread w_multithread

type variables
end variables

event ue_start_select();long ll_counter

FOR ll_counter = 1 TO 32565
	IF gb_result THEN 
		MessageBox('Svershilos', 'Ostanovka')
		EXIT
	END IF
	st_1.TEXT = STRING(ll_counter)
NEXT
end event

event ue_stop_select();gb_result = TRUE
MessageBox('Stop', 'Stop LOOP')
end event

on w_multithread.create
this.cb_1=create cb_1
this.st_1=create st_1
this.Control[]={this.cb_1,&
this.st_1}
end on

on w_multithread.destroy
destroy(this.cb_1)
destroy(this.st_1)
end on

event closequery;SharedObjectUnRegister('my_timer1') 
SharedObjectUnRegister('my_timer2') 


end event

type cb_1 from commandbutton within w_multithread
integer x = 457
integer y = 20
integer width = 402
integer height = 112
integer taborder = 20
integer textsize = -10
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Arial"
string text = "Timer"
end type

event clicked;nvuo_timer lnvuo_timer1, lnvuo_timer2

gb_result = FALSE

SharedObjectRegister('nvuo_timer','my_timer1') 
SharedObjectGet('my_timer1',lnvuo_timer1) 
lnvuo_timer1.iw_window = Parent
lnvuo_timer1.is_command = 'START SELECT'
lnvuo_timer1.Post Start(0.5)

SharedObjectRegister('nvuo_timer','my_timer2') 
SharedObjectGet('my_timer2',lnvuo_timer2) 
lnvuo_timer2.iw_window = Parent
lnvuo_timer2.is_command = 'STOP SELECT'
lnvuo_timer2.Post Start(1)
end event

type st_1 from statictext within w_multithread
integer x = 18
integer y = 16
integer width = 384
integer height = 80
integer textsize = -8
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Arial"
long textcolor = 8388608
long backcolor = 67108864
boolean enabled = false
string text = "0"
alignment alignment = center!
boolean border = true
borderstyle borderstyle = stylelowered!
boolean focusrectangle = false
end type

Остановка срабатывает только после завершения цикла. А должна через секунду.
Где ошибка?
23 мар 17, 11:45    [20324789]     Ответить | Цитировать Сообщить модератору
 Re: Multithread  [new]
Dim2000
Member

Откуда: Москва
Сообщений: 5318

23.03.2017 11:45, Riska пишет:

> Остановка срабатывает только после завершения цикла. А должна через секунду.
> Где ошибка?

А сообщения кто будет обрабатывать ;)?

Posted via ActualForum NNTP Server 1.5

23 мар 17, 13:18    [20325434]     Ответить | Цитировать Сообщить модератору
 Re: Multithread  [new]
Raven A
Member

Откуда: Moscow
Сообщений: 117
Riska,
Уберите SharedObjectRegister(...) и SharedObjectGet(...)
23 мар 17, 14:00    [20325756]     Ответить | Цитировать Сообщить модератору
 Re: Multithread  [new]
Riska
Member

Откуда: Израиль
Сообщений: 985
Dim2000,

2 потока должны бежать отдельно друг от друга.
Запускается цикл. Через секунду запустится стопер.
Это не работает. Я не понимаю, почему.
Что нужно добавить в скрипт?
23 мар 17, 14:04    [20325785]     Ответить | Цитировать Сообщить модератору
 Re: Multithread  [new]
Riska
Member

Откуда: Израиль
Сообщений: 985
Raven A,

Убрал.
Ничего не изменилось.
Сообщение из второго объекта выскакивает только после завершения цикла.
23 мар 17, 14:07    [20325812]     Ответить | Цитировать Сообщить модератору
 Re: Multithread  [new]
Dim2000
Member

Откуда: Москва
Сообщений: 5318

23.03.2017 14:04, Riska пишет:

> Это не работает. Я не понимаю, почему.

Потому что никто не обрабатывает сообщения таймера.

> Что нужно добавить в скрипт?

Елду ;).

Posted via ActualForum NNTP Server 1.5

23 мар 17, 14:36    [20326048]     Ответить | Цитировать Сообщить модератору
 Re: Multithread  [new]
Riska
Member

Откуда: Израиль
Сообщений: 985
Dim2000,
Ок.
А если вместо этого цикла будет SELECT?
23 мар 17, 14:48    [20326142]     Ответить | Цитировать Сообщить модератору
 Re: Multithread  [new]
Dim2000
Member

Откуда: Москва
Сообщений: 5318

23.03.2017 14:48, Riska пишет:

> А если вместо этого цикла будет SELECT?

Лень пробовать, но, подозреваю, ничего хорошего :).

Posted via ActualForum NNTP Server 1.5

23 мар 17, 15:01    [20326212]     Ответить | Цитировать Сообщить модератору
 Re: Multithread  [new]
Raven A
Member

Откуда: Moscow
Сообщений: 117
Riska,
> А если вместо этого цикла будет SELECT ...
а поподробнее?
В чём мегацель - то?
23 мар 17, 15:31    [20326351]     Ответить | Цитировать Сообщить модератору
 Re: Multithread  [new]
Riska
Member

Откуда: Израиль
Сообщений: 985
Raven A,
Цикл я нарисовал только для примера (и не подумал, что в этом случае Yield решит проблему).

Короче, объясняю, что имеем.

Отправляется запрос на некий сервис. В ответ получаем string.
Если там какая-то проблема (комп выключен!), то происходит зависание.
Появилась идея запустить 2 процесса (SharedObjectа):
один с селектом
gb_ok = FALSE
ls_return = vipolnenie_chego_to()
gb_ok = TRUE

второй - через 30 секунд проверит gb_ok.
Если до сих пор FALSE, то просто убить процесс и пойти дальше.

Как сделать?
23 мар 17, 15:47    [20326455]     Ответить | Цитировать Сообщить модератору
 Re: Multithread  [new]
Raven A
Member

Откуда: Moscow
Сообщений: 117
Если база поддерживает, то SQLCA.DbParameter="CommandTimeout=XXX"

Процесс -то, оно, того, канешна, иногда нууу и таки да, если постараться.
Однако "штатной" обвязки будет много, стоит оценить затраты.
23 мар 17, 16:25    [20326709]     Ответить | Цитировать Сообщить модератору
 Re: Multithread  [new]
Riska
Member

Откуда: Израиль
Сообщений: 985
Raven A,

Таймаут не поможет.
Это некий сервис, который сидит на соседнем сервере (компе).
Если этот комп выключен, то запрос туда не доходит.
23 мар 17, 16:32    [20326736]     Ответить | Цитировать Сообщить модератору
 Re: Multithread  [new]
spas2001
Member

Откуда: Тамбов--->Москва-->Тамбов-->Москва-->Тамбов
Сообщений: 2010
Зачем делать отдельный объект если есть штатный timer
Сначала проверить все через него, потом сделать потоки.
А еще предложение, может сначала сделать ping или что-то специфичное, типа tnsping для проверки соединения, а потом уже пускать запрос?
24 мар 17, 08:23    [20328049]     Ответить | Цитировать Сообщить модератору
 Re: Multithread  [new]
spas2001
Member

Откуда: Тамбов--->Москва-->Тамбов-->Москва-->Тамбов
Сообщений: 2010
Кстати, как вы собираетесь прерывать команду? Что-то смутно себе это представляю. Кроме предложенного таймаута или ретрайва в DW.
24 мар 17, 08:30    [20328062]     Ответить | Цитировать Сообщить модератору
 Re: Multithread  [new]
Riska
Member

Откуда: Израиль
Сообщений: 985
spas2001,
штатный timer есть только в окне и он тоже не помогает.
Пинг срабатывает нормально, т.к. ответ получаем от модема.
Даже маленький селектик, типа "select 1..." подвисает.
Кстати, как вы собираетесь прерывать команду? - Просто убью shared объект.
24 мар 17, 12:40    [20329167]     Ответить | Цитировать Сообщить модератору
 Re: Multithread  [new]
Raven A
Member

Откуда: Moscow
Сообщений: 117
Riska,
из серии "сам Бродского не читал ..."
Сам не использовал, но можно попробовать поиграться с параметром DBGetTime
24 мар 17, 12:53    [20329232]     Ответить | Цитировать Сообщить модератору
 Re: Multithread  [new]
spas2001
Member

Откуда: Тамбов--->Москва-->Тамбов-->Москва-->Тамбов
Сообщений: 2010
Тогда и транзакция и все остальное должно быть внутри этого объекта
24 мар 17, 16:51    [20330345]     Ответить | Цитировать Сообщить модератору
Все форумы / PowerBuilder Ответить