purebasic.info

PureBasic forum
Текущее время: Вт дек 11, 2018 12:20 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Сб окт 15, 2011 6:37 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Пт июл 29, 2011 9:37 pm
Сообщений: 163
Откуда: Москва
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Мне кажеться, что и
Цитата:
с помощью мьютексов разграничить обращение к гаджетам и иконке в трее

и
Цитата:
Когда пришло новое сообшение, то записывай в какую нибудь глобальную переменную допустим true, а в главном цикле основного потока(программы) проверяй её, если false то ни чего не делай, а если true то выводи окно или меняй иконку и т.д. по необходимости.

дадут одинаковый эффект (если вообще дадут), но второй способ легче.
Или я не прав?

_________________
Windows Xp | Ubuntu 11.04 | Linux Mint 9 || PB 4.51 x86


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб окт 15, 2011 6:49 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт дек 17, 2009 4:49 pm
Сообщений: 1230
Откуда: г. Ангарск
Благодарил (а): 2 раз.
Поблагодарили: 16 раз.
Пункты репутации: 10
Cloud писал(а):
Или я не прав?

Прав. А по поводу, что легче тебе решать(ты же пишешь) :wink:
Я например до сих пор не могу понять как работать с мьютесами и семафорами :cry: , поэтому для меня проще с флагами.

_________________
.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб окт 15, 2011 6:51 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11336
Благодарил (а): 4 раз.
Поблагодарили: 443 раз.
Cloud писал(а):
второй способ легче
Я бы так не сказал!
Понадобится сделать что-то типа выполнения заданий, если их много.

lakomet писал(а):
Я например до сих пор не могу понять как работать с мьютесами и семафорами
Если бы пришлось бы работать с динамически связанным списком из нескольких потоков, то быстро научился бы, потому как без мьюльтексов будет полный хаос!
И там ничего сложного нет - заблокировали мьюльтекс, сделали дело, разблокировали мьюльтекс.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Последний раз редактировалось Пётр Сб окт 15, 2011 6:56 pm, всего редактировалось 2 раз(а).

Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб окт 15, 2011 6:55 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Пт июл 29, 2011 9:37 pm
Сообщений: 163
Откуда: Москва
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Понял, спасибо, о результатах отпишу здесь.

_________________
Windows Xp | Ubuntu 11.04 | Linux Mint 9 || PB 4.51 x86


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб окт 15, 2011 6:56 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт дек 17, 2009 4:49 pm
Сообщений: 1230
Откуда: г. Ангарск
Благодарил (а): 2 раз.
Поблагодарили: 16 раз.
Пункты репутации: 10
Пётр
Если есть урок с картинками, буду премного благодарен.
:roll:

_________________
.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб окт 15, 2011 6:59 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11336
Благодарил (а): 4 раз.
Поблагодарили: 443 раз.
lakomet писал(а):
Если есть урок с картинками, буду премного благодарен.
Вроде давал уже примеры.
http://purebasic.mybb.ru/viewtopic.php?id=159

Если есть еще вопросы, то думаю что лучше это обсудить в отдельной теме.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб окт 15, 2011 7:10 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт дек 17, 2009 4:49 pm
Сообщений: 1230
Откуда: г. Ангарск
Благодарил (а): 2 раз.
Поблагодарили: 16 раз.
Пункты репутации: 10
Пётр
Я помню эту тему, но тупой я :oops: , без картинок до сих пор не вьехал :oops:
Все мои начинания с потоками, мьютексами и семафорами валятся с ошибками, поэтому всегда отлаживаю на потом.
Видимо нужна поллитры :D , но я не пью(поэтому не судьба осилить потоки, мьютексы и семафоры).

_________________
.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб окт 15, 2011 7:44 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11336
Благодарил (а): 4 раз.
Поблагодарили: 443 раз.
Пётр писал(а):
Если бы пришлось бы работать с динамически связанным списком из нескольких потоков, то быстро научился бы, потому как без мьюльтексов будет полный хаос!

Пример, демонстрирующий это.
Если не блокировать мьютексом работу со списком, то может получится такая ситуация, что данные будут прочитаны или записаны не в тот элемент.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Global NewList TestList.l()
 
Procedure Thread(Number)
  Repeat
    SelectElement(TestList(), Number-1)
    Delay(Random(400)+200)
    Debug "Поток №"+Str(Number)+" данные "+Str(TestList())
  ForEver
EndProcedure
 
For i=1 To 4
  AddElement(TestList())
  TestList() = i
Next
 
For i=1 To 4
  CreateThread(@Thread(), i)
Next
 
MessageRequester("", "Нажниме 'OK' для закрытия программы")

Номер элемента и данные должны быть одинаковыми.
Если цифры разные, то это значит что во время выполнения функции Delay(), другой поток изменил текущий элемент списка - глюк.
Мьюльтексы полностью решают эту проблему - другие потоки джут пока будет разблокирован мьюльтекс и только после этого, один из потоков сможет захватить мьюльтекс и получить доступ к списку, а другие потоки будут ожидать пока этот поток разблокирует мьюльтекс.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Global NewList TestList.l()
Global Mutex = CreateMutex()
 
 
Procedure Thread(Number)
  Repeat
    LockMutex(Mutex)
    SelectElement(TestList(), Number-1)
    Delay(Random(400)+200)
    Debug "Поток №"+Str(Number)+" данные "+Str(TestList())
    UnlockMutex(Mutex)
  ForEver
EndProcedure
 
For i=1 To 4
  AddElement(TestList())
  TestList() = i
Next
 
For i=1 To 4
  CreateThread(@Thread(), i)
Next
 
MessageRequester("", "Нажниме 'OK' для закрытия программы")


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс окт 16, 2011 4:03 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт дек 17, 2009 4:49 pm
Сообщений: 1230
Откуда: г. Ангарск
Благодарил (а): 2 раз.
Поблагодарили: 16 раз.
Пункты репутации: 10
Пётр
В последнем примере
Код:
1
2
3
4
5
6
7
8
9
10
11
 
Поток №2 данные 2
Поток №2 данные 2
Поток №2 данные 2
Поток №2 данные 2
Поток №2 данные 2
Поток №2 данные 2
Поток №2 данные 2
Поток №2 данные 2
Поток №2 данные 2
Поток №2 данные 2


хотя я считаю что должно быть
Код:
1
2
3
4
5
6
7
8
9
10
11
 
Поток №3 данные 3
Поток №3 данные 3
Поток №2 данные 2
Поток №4 данные 4
Поток №1 данные 1
Поток №1 данные 1
Поток №1 данные 1
Поток №2 данные 2
Поток №4 данные 4
Поток №2 данные 2

т.е. потоки должны лочить мьютекс в разнобой, а получается, что один поток залочил мьютекс и других не пускает или я не прав?[/code]

_________________
.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс окт 16, 2011 4:12 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11336
Благодарил (а): 4 раз.
Поблагодарили: 443 раз.
В винде работает нормально так, как есть сейчас, а в лине нужно добавить строку Delay(2) после UnlockMutex(Mutex).
Возможно это особенность линя такая.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс окт 16, 2011 4:37 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт дек 17, 2009 4:49 pm
Сообщений: 1230
Откуда: г. Ангарск
Благодарил (а): 2 раз.
Поблагодарили: 16 раз.
Пункты репутации: 10
Пётр
Добавил Delay(2), теперь работает. Ни за что бы не догадался, сломал бы мозг и плюнул бы на это дело в очередной раз.

_________________
.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс окт 16, 2011 5:26 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Пт июл 29, 2011 9:37 pm
Сообщений: 163
Откуда: Москва
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Решил развести программу на 4 потока:
1. Опрос гаджетов\трея
2. Парсинг сайта
3. Действия с окнами\гаджетами
4. Действия с треем
Команды на действий между потоками передаются через глобальные переменные(флаги).

Но проблемы с треем. Как только срабатывает событие скрытия окна + смены иконки трея, то этого не происходит, до тех пор, пока не провести по иконке мышкой. В этом случае закрываеться программа полностью с ошибкой. Пробовал отключить опрос трея - тоже самое. :(

Совмем ничего понять не могу. Почему программа корректно работает под окнами и некорректно в пингвине, на одном и том же коде..
Такое обивает все желание писать под линь :cry:

_________________
Windows Xp | Ubuntu 11.04 | Linux Mint 9 || PB 4.51 x86


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс окт 16, 2011 5:44 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11336
Благодарил (а): 4 раз.
Поблагодарили: 443 раз.
Cloud писал(а):
1. Опрос гаджетов\трея
Разве то таймеру это нельзя сделать?

Cloud писал(а):
3. Действия с окнами\гаджетами
4. Действия с треем
Тоже самое. По таймеру.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс окт 16, 2011 6:00 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт дек 17, 2009 4:49 pm
Сообщений: 1230
Откуда: г. Ангарск
Благодарил (а): 2 раз.
Поблагодарили: 16 раз.
Пункты репутации: 10
Cloud писал(а):
Почему программа корректно работает под окнами и некорректно в пингвине, на одном и том же коде..

Из за разного подхода к обработке событий(это если коротко), а так давай код посмотрим.
З.Ы. То же самое я матерюсь, когда у меня на лине работае а в винде нет, тоже желание писать под винду пропадает :wink:

_________________
.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс окт 16, 2011 6:28 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Пт июл 29, 2011 9:37 pm
Сообщений: 163
Откуда: Москва
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Цитата:
Разве то таймеру это нельзя сделать?

Конечно можно. Но с потоками мне как-то поудобнее.
Но если уж совсем припрет, то что уж делать, придется либо упрощать программу, либо обеспоточивать.
Цитата:
Из за разного подхода к обработке событий

Ну это то понятно, но разве не должен компилятор(в идеале) вести себя на разных осях одинаково? Вроде в том числе и для этого он и есть кроссплатформенный.
Цитата:
давай код посмотрим

Я бы не советовал это делать прямо сейчас, т.к. сейчас я и сам с некоторым трудом разбираюсь в нем :oops: ,но все же вот он.
------------
Еще небольшой вопросик - у меня приложенние при явном выполнении команды
Код:
1
End

не закрывается полностью(т.е. пропадают все видимые признаки, но похоже оно остается висеть в памяти), а закрывается только по нажатию соответвующей кнопки в компиляторе. Может кто сталкивался?

_________________
Windows Xp | Ubuntu 11.04 | Linux Mint 9 || PB 4.51 x86


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB