Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26163
Рейтинг: 2127
#31: 2010-08-22 01:33:34 ЛС | профиль | цитата
Так я и думал -- в этой схеме поток уничтожает сам себя из одной очереди событий, а из этого потока запущен мультик
------------ Дoбавленo в 01.31:
Вообще-то, поток лучше удалть из главной очереди событий



Add(MainForm,4707376,455,308)
{
}
Add(Button,9216743,455,350)
{
Left=140
Top=115
link(onClick,6227575:doStart,[])
}
Add(LED,7466491,623,350)
{
Left=235
Top=115
}
Add(Thread,6227575,518,350)
{
Delay=500
FastStop=0
link(onExec,4400107:doTimer,[])
link(onSyncExec,6227575:doStop,[(564,363)(564,392)(506,392)(506,363)])
}
Add(MultiElementEx,4400107,574,350)
{
link(onTimer,7466491:doChangeValue,[])
}
BEGIN_SDK
Add(EditMultiEx,7027516,21,21)
{
WorkCount=#20:doTimer=просто точка|0:|
EventCount=#20:onTimer=просто точка|0:|
link(doTimer,7027516:onTimer,[])
}
END_SDK

------------ Дoбавленo в 01.33:
В данном случае, событие onSynExec появится только тогда в главной очереди, когда дополнительный поток полностью отработает событие onExec
карма: 22

1
Голосовали:login
Ответов: 1429
Рейтинг: 50
#32: 2010-08-22 01:48:12 ЛС | профиль | цитата
Спасибо. Теперь я это понимаю.
А я до Вашего поста исправил вот-так, дело в том, что внутри мультика стоит много элементов, среди которых есть таймеры и сетевые клиенты (они моут отдельный поток породить), поэтому я сделал такое:

code_20144.txt
------------ Дoбавленo в 01.48:
У меня к Вам еще есть вопросик:
А почему не работает такое? И как сделать чтобы работало?

Add(MainForm,2953706,21,105)
{
}
Add(Button,9216743,259,231)
{
Left=140
Top=115
link(onClick,6227575:doStart,[])
}
Add(LED,7466491,406,231)
{
Left=235
Top=115
}
Add(Thread,6227575,308,231)
{
Delay=500
FastStop=0
link(onExec,4400107:doTimer,[])
}
Add(MultiElementEx,4400107,357,231)
{
link(onTimer,7466491:doChangeValue,[])
}
BEGIN_SDK
Add(EditMultiEx,7027516,21,21)
{
WorkCount=#20:doTimer=просто точка|0:|
EventCount=#20:onTimer=просто точка|0:|
link(doTimer,14697696:doTimer,[(73,27)(73,118)])
}
Add(Timer,14697696,140,112)
{
Interval=500
Enable=1
AutoStop=5
link(onTimer,7027516:onTimer,[(240,118)(240,27)])
}
END_SDK


карма: 0

0
файлы: 1code_20144.txt [751B] [64]
Разработчик
Ответов: 26163
Рейтинг: 2127
#33: 2010-08-22 01:56:31 ЛС | профиль | цитата
Вообще-то, таймер принадлежит главному потоку и запустить его можно только из главной очереди событий
------------ Дoбавленo в 01.56:
В таком случае, необходимо прокрутить главную очередь событий для запуска таймера



Add(MainForm,9324798,448,238)
{
}
Add(Button,9216743,448,287)
{
Left=140
Top=115
link(onClick,6227575:doStart,[])
}
Add(LED,7466491,595,287)
{
Left=235
Top=115
}
Add(Thread,6227575,497,287)
{
Delay=500
FastStop=0
link(onExec,4400107:doTimer,[])
}
Add(MultiElementEx,4400107,546,287)
{
link(onTimer,7466491:doChangeValue,[])
}
BEGIN_SDK
Add(EditMultiEx,7027516,21,21)
{
WorkCount=#20:doTimer=просто точка|0:|
EventCount=#20:onTimer=просто точка|0:|
link(doTimer,16329997:doEvent1,[(42,27)(42,118)])
}
Add(Timer,14697696,126,112)
{
Interval=500
Enable=1
AutoStop=5
link(onTimer,7027516:onTimer,[(240,118)(240,27)])
}
Add(Hub,16329997,70,112)
{
link(onEvent1,14697696:doTimer,[])
link(onEvent2,14725427:doLoopMessages,[(105,125)(105,160)])
}
Add(Application,14725427,126,147)
{
Point(doLoopMessages)
}
END_SDK

карма: 22

0
Ответов: 1429
Рейтинг: 50
#34: 2010-08-22 02:02:22 ЛС | профиль | цитата
Ухты!
Очередь сообщений? А что оно сделало с потоком?
карма: 0

0
Ответов: 1841
Рейтинг: 369
#35: 2010-08-22 02:03:15 ЛС | профиль | цитата
Кстати, тоже хотел как то задать вопрос на счёт потоков и таймера.
Вот в этом примере показаны 2 случая:
1) Таймер не запускается из нового потока (решено)
2) Если установить Delay=0 у элемента Thread и попытаться запустить таймер в новом потоке а новый поток запустить нажатием на кнопку то кнопка просто зависнет хотя программа продолжит нормально функционировать... (решено)

Пример:
code_20145.txt

Почему так происходит?
карма: 1
0
Ответов: 1429
Рейтинг: 50
#36: 2010-08-22 02:03:42 ЛС | профиль | цитата
Типа как будто на шаг вперед, по хабу, раньше времени?
карма: 0

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#37: 2010-08-22 02:04:39 ЛС | профиль | цитата
Но все это -- не совсем правильно. Запускать таймер внутри дополнительного потока, который синхронизирован с главным потоком, тут хз, что может произойти. Да и не удалишь ты дополнительный поток никак, пока не остановишь все таймеры внутри него. Короче, так лучше не делать
карма: 22

0
Ответов: 1429
Рейтинг: 50
#38: 2010-08-22 02:05:40 ЛС | профиль | цитата
CriDos, у меня кнопка не виснет. Просто ничего не происходит.
карма: 0

0
Ответов: 1841
Рейтинг: 369
#39: 2010-08-22 02:09:02 ЛС | профиль | цитата
login писал(а):
CriDos, у меня кнопка не виснет. Просто ничего не происходит.

мм, оказывается 2 раза нужно запустить поток (2 раза нажать на кнопку) чтобы кнопка зависла
Но всё равно кнопка виснет
карма: 1
0
файлы: 1code_20145.txt [874B] [102]
Разработчик
Ответов: 26163
Рейтинг: 2127
#40: 2010-08-22 02:10:25 ЛС | профиль | цитата
login писал(а):
Просто ничего не происходит

А что должно произойти, когда на выходе ничего нет

CriDos, ты читал, что я выше твоего поста написал, советую почитать, это и есть ответ на твой вопрос
------------ Дoбавленo в 02.10:
CriDos писал(а):
Но всё равно кнопка виснет

А так виснет



Add(Button,4347523,203,343)
{
Left=90
Top=85
Width=195
Height=90
Caption="2) Если нажать то кнопка зависнет"
link(onClick,14354879:doStart,[])
}
Add(Thread,14354879,252,343)
{
Delay=0
FastStop=0
link(onExec,14315149:doEvent1,[])
}
Add(Timer,8828701,350,343)
{
Interval=0
Enable=1
AutoStop=1
}
Add(Application,15303224,350,378)
{
Point(doLoopMessages)
}
Add(Hub,14315149,301,343)
{
link(onEvent1,8828701:doTimer,[])
link(onEvent2,15303224:doLoopMessages,[(333,356)(333,391)])
}

карма: 22

1
Голосовали:CriDos
Ответов: 1429
Рейтинг: 50
#41: 2010-08-22 02:10:31 ЛС | профиль | цитата
nesco писал(а):
Да и не удалишь ты дополнительный поток никак, пока не остановишь все таймеры внутри него

CriDos, nesco, Если я правильно понимаю (что врядли) тут таймер запущен в отдельном потоке, и он благополучно завершается вместе с ним.
И таймер останавливать не надо он сам.

code_20146.txt


Там автостоп был. Я разобрался.

---------
Я нажимал несколько раз ничего не виснет
карма: 0

0
файлы: 1code_20146.txt [966B] [56]
Ответов: 1841
Рейтинг: 369
#42: 2010-08-22 02:12:02 ЛС | профиль | цитата
nesco, всё, разобрался

code_20147.txt
карма: 1
0
файлы: 1code_20147.txt [531B] [126]
Разработчик
Ответов: 26163
Рейтинг: 2127
#43: 2010-08-22 02:25:47 ЛС | профиль | цитата
Не завершается, нет события на doStop, а светодиод остается гореть, потому, что таймер заканчивает 5 циклов. Запущенный один раз таймер напрочь блокирует дополнительный поток и событие onExec никогда не заканчивается.
------------ Дoбавленo в 02.25:
И удалить этот дополнительный поток никак не удается, только извне, принудительно. Или применив другой таймер



Add(MainForm,9324798,238,140)
{
}
Add(Button,9216743,238,189)
{
Left=140
Top=115
link(onClick,6227575:doStart,[])
}
Add(LED,7466491,427,189)
{
Left=235
Top=115
}
Add(Thread,6227575,294,189)
{
Delay=500
FastStop=0
Point(doStopFlag)
link(onExec,4400107:doTimer,[])
}
Add(MultiElementEx,4400107,350,189)
{
link(onTimer,7466491:doChangeValue,[])
link(onStop,7630725:doTimer,[(397,202)(397,277)(226,277)(226,237)])
}
BEGIN_SDK
Add(EditMultiEx,7027516,21,21)
{
WorkCount=#20:doTimer=просто точка|0:|
EventCount=#20:onTimer=просто точка|6:onStop|
link(doTimer,16329997:doEvent1,[(42,27)(42,118)])
}
Add(Timer,14697696,126,112)
{
Interval=500
Enable=1
AutoStop=5
Point(onStop)
link(onTimer,7027516:onTimer,[(240,118)(240,27)])
link(onStop,7027516:onStop,[(258,125)(258,34)])
}
Add(Hub,16329997,70,112)
{
link(onEvent1,14697696:doTimer,[])
link(onEvent2,14725427:doLoopMessages,[(105,125)(105,181)])
}
Add(Application,14725427,126,168)
{
Point(doLoopMessages)
}
END_SDK
Add(Timer,7630725,238,231)
{
Interval=0
Enable=1
AutoStop=1
link(onTimer,6227575:doStop,[(282,237)(282,202)])
}


карма: 22

0
Ответов: 1429
Рейтинг: 50
#44: 2010-08-22 02:30:59 ЛС | профиль | цитата
Да, все верно, я не увидел автостоп.
------------ Дoбавленo в 02.30:
nesco писал(а):
И удалить этот дополнительный поток никак не удается, только извне, принудительно. Или применив другой таймер

А разве тут он сам себя не удаляет? Диод просто горит случайно.

Add(MainForm,9324798,119,84)
{
}
Add(Button,9216743,119,133)
{
Left=140
Top=115
link(onClick,6227575:doStart,[])
}
Add(LED,7466491,280,133)
{
Left=235
Top=115
}
Add(Thread,6227575,175,133)
{
Delay=500
FastStop=0
link(onExec,4400107:doTimer,[])
link(onSyncExec,6227575:doStop,[(218,146)(218,118)(163,118)(163,146)])
}
Add(MultiElementEx,4400107,224,133)
{
link(onTimer,7466491:doChangeValue,[])
}
BEGIN_SDK
Add(EditMultiEx,7027516,21,21)
{
WorkCount=#20:doTimer=просто точка|0:|
EventCount=#20:onTimer=просто точка|0:|
link(doTimer,16329997:doEvent1,[(42,27)(42,118)])
}
Add(Timer,14697696,126,112)
{
Interval=100
Enable=1
AutoStop=6
link(onTimer,7027516:onTimer,[(240,118)(240,27)])
}
Add(Hub,16329997,70,112)
{
link(onEvent1,14697696:doTimer,[])
link(onEvent2,14725427:doLoopMessages,[(105,125)(105,160)])
}
Add(Application,14725427,126,147)
{
Point(doLoopMessages)
}
END_SDK



карма: 0

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#45: 2010-08-22 02:33:51 ЛС | профиль | цитата
login писал(а):
А разве тут он сам себя не удаляет?

А че ты гадаешь на кофейной гуще -- поставь дебаг и посмотри, есть событие onSyncExec, или его нет
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)