powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Multithread
17 сообщений из 17, страница 1 из 1
Multithread
    #39425579
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Драсьте!

Задача: нужно остановить через какое-то время длинный процесс.
Пытаюсь сделать так:
Код: 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.
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



Код: 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.
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


Остановка срабатывает только после завершения цикла. А должна через секунду.
Где ошибка?
...
Рейтинг: 0 / 0
Multithread
    #39425720
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
23.03.2017 11:45, Riska пишет:

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

А сообщения кто будет обрабатывать ;)?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Multithread
    #39425772
Фотография Raven A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Riska,
Уберите SharedObjectRegister(...) и SharedObjectGet(...)
...
Рейтинг: 0 / 0
Multithread
    #39425776
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dim2000,

2 потока должны бежать отдельно друг от друга.
Запускается цикл. Через секунду запустится стопер.
Это не работает. Я не понимаю, почему.
Что нужно добавить в скрипт?
...
Рейтинг: 0 / 0
Multithread
    #39425781
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Raven A,

Убрал.
Ничего не изменилось.
Сообщение из второго объекта выскакивает только после завершения цикла.
...
Рейтинг: 0 / 0
Multithread
    #39425817
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
23.03.2017 14:04, Riska пишет:

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

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

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

Елду ;).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Multithread
    #39425837
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dim2000,
Ок.
А если вместо этого цикла будет SELECT?
...
Рейтинг: 0 / 0
Multithread
    #39425844
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
23.03.2017 14:48, Riska пишет:

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

Лень пробовать, но, подозреваю, ничего хорошего :).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Multithread
    #39425874
Фотография Raven A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Riska,
> А если вместо этого цикла будет SELECT ...
а поподробнее?
В чём мегацель - то?
...
Рейтинг: 0 / 0
Multithread
    #39425900
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Raven A,
Цикл я нарисовал только для примера (и не подумал, что в этом случае Yield решит проблему).

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

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


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

Как сделать?
...
Рейтинг: 0 / 0
Multithread
    #39425937
Фотография Raven A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если база поддерживает, то SQLCA.DbParameter="CommandTimeout=XXX"

Процесс -то, оно, того, канешна, иногда нууу и таки да, если постараться.
Однако "штатной" обвязки будет много, стоит оценить затраты.
...
Рейтинг: 0 / 0
Multithread
    #39425946
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Raven A,

Таймаут не поможет.
Это некий сервис, который сидит на соседнем сервере (компе).
Если этот комп выключен, то запрос туда не доходит.
...
Рейтинг: 0 / 0
Multithread
    #39426239
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем делать отдельный объект если есть штатный timer
Сначала проверить все через него, потом сделать потоки.
А еще предложение, может сначала сделать ping или что-то специфичное, типа tnsping для проверки соединения, а потом уже пускать запрос?
...
Рейтинг: 0 / 0
Multithread
    #39426243
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, как вы собираетесь прерывать команду? Что-то смутно себе это представляю. Кроме предложенного таймаута или ретрайва в DW.
...
Рейтинг: 0 / 0
Multithread
    #39426469
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spas2001,
штатный timer есть только в окне и он тоже не помогает.
Пинг срабатывает нормально, т.к. ответ получаем от модема.
Даже маленький селектик, типа "select 1..." подвисает.
Кстати, как вы собираетесь прерывать команду? - Просто убью shared объект.
...
Рейтинг: 0 / 0
Multithread
    #39426482
Фотография Raven A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Riska,
из серии "сам Бродского не читал ..."
Сам не использовал, но можно попробовать поиграться с параметром DBGetTime
...
Рейтинг: 0 / 0
Multithread
    #39426666
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда и транзакция и все остальное должно быть внутри этого объекта
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Multithread
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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