purebasic.info

PureBasic forum
Текущее время: Пт авг 23, 2019 1:32 am

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




Начать новую тему Ответить на тему  [ Сообщений: 79 ]  На страницу 1, 2, 3, 4, 5, 6  След.
Автор Сообщение
СообщениеДобавлено: Ср апр 09, 2014 7:18 pm 
Не в сети
доцент

Зарегистрирован: Вс мар 16, 2014 5:42 am
Сообщений: 49
Благодарил (а): 7 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Здравствуйте, возникла проблема в такой ситуации:
Создаю окно, предположим что после нажатия кнопки создается новый поток с указателем на процедуру, в том же новосозданном потоке создаю еще один поток уже к другой процедуре(Отсчет времени после нажатия на кнопку). Но после того как используются эти 2 потока то программа начинает "чудить" - дебаггер считает что перед StartDrawing должна быть использована StopDrawing (Хотя все делаю правильно), WaitWindowEvent тоже начинает "предъявлять притензии", также и WriteData считает что файл не иницализирован.
Если я не создаю поток с отсчетом времени, то все работает нормально.

Прошу помощи как разобрать данную тему.

Версия PureBasic 5.11
Windows 8.1 (Upd1)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср апр 09, 2014 7:29 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 71 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Во-первых, включена ли поддержка потоков в настройках компилятора?
Во-вторых, вы код можете выложить?

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср апр 09, 2014 7:40 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6539
Благодарил (а): 28 раз.
Поблагодарили: 220 раз.
Пункты репутации: 57
Случайно спрайты и прочие штучки DirectX внутри потоков не используются?

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт апр 10, 2014 5:04 am 
Не в сети
доцент

Зарегистрирован: Вс мар 16, 2014 5:42 am
Сообщений: 49
Благодарил (а): 7 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Никита Однороб, спасибо большое! Включил в настройках компилятора "Thread-Safe" и весь код правильно стал функционировать.
kvitaliy, разве что рисование 2D которое применяю для рисования элементов окна.

Можно ли узнать - эта "канитель" произошла из-за применения в потоках глобальных переменных и участков памяти? (Прочитал в википедии)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб май 24, 2014 4:49 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пт янв 27, 2012 7:12 pm
Сообщений: 884
Откуда: Кустанай
Благодарил (а): 27 раз.
Поблагодарили: 13 раз.
Пункты репутации: 7
Не нашёл более подходящей темы для своего вопроса

Есть программа, работает в многопточном режиме, каждый поток юзает один элемент глобального массива
пример
поток 1 = элемент массива arr(1)
поток 2 = элемент массива arr(2)
поток 3 = элемент массива arr(3)
поток 4 = элемент массива arr(4)

Сам вопрос
Если обращения к разным элементам одного массива пересекутся, будет ошибка?
Иными словами, надо ли закрывать мьютексами эти обращения, или нет, ведь адреса у элементов разные, хоть массив и общий

Сэмулировать ошибку не смог, или её просто не возникает

_________________
Детям нельзя в интернет. От детей интернет тупеет.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб май 24, 2014 5:03 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11505
Благодарил (а): 4 раз.
Поблагодарили: 469 раз.
Ошибок не должно быть.

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб май 24, 2014 5:11 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 71 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Не возникает
Код:
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
Global Dim arr(1)
 
arr(1) = 5
 
Procedure Thread1(*x)
  Protected a
  For i = 1 To 100
    a = arr(1)
    Delay(10)
  Next
EndProcedure
 
Procedure Thread2(*x)
  Protected a
  For i = 1 To 100
    a = arr(1)
    Delay(10)
  Next
EndProcedure
 
Procedure Thread3(*x)
  Protected a
  For i = 1 To 100
    a = arr(1)
    Delay(10)
  Next
EndProcedure
 
th1 = CreateThread(@Thread1(), 1)
th2 = CreateThread(@Thread2(), 1)
th3 = CreateThread(@Thread3(), 1)
 
WaitThread(th1)


_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб май 24, 2014 5:13 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пт янв 27, 2012 7:12 pm
Сообщений: 884
Откуда: Кустанай
Благодарил (а): 27 раз.
Поблагодарили: 13 раз.
Пункты репутации: 7
Код:
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
Structure th
  val.l
  th.l
EndStructure
 
Global Dim arr.th(100)
 
Procedure thr(num)
  For i=0 To 10000
    arr(num)\val = Random(10000, 0)
    Delay(1)
  Next i
 
  ProcedureReturn #False
EndProcedure
 
For i=0 To 100
  arr.th(i)\th = CreateThread(@thr(), i)
Next i
 
Repeat
  stop = #True
 
  For i=0 To 100
    If IsThread(arr.th(i)\th)<>0
      stop = #False
      Break
    EndIf
  Next i
  Delay(10)
Until stop = #True




Ну вот этот код без ошибок уже раз 20 отработал, будем надеяться, что так и будет :D

_________________
Детям нельзя в интернет. От детей интернет тупеет.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб май 24, 2014 7:49 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2320
Откуда: Russia — Belarus
Благодарил (а): 7 раз.
Поблагодарили: 75 раз.
Пункты репутации: 11
В память же нельзя обращаться одновременно? В смысле нет многопоточности (как например, у CPU). Отсюда и ошибок быть не должно.

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн мар 16, 2015 5:15 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1766
Откуда: Алматы
Благодарил (а): 17 раз.
Поблагодарили: 49 раз.
Пункты репутации: 5
Код:
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
Enumeration
 
  #window
 
EndEnumeration
 
Procedure AlertThread(Parameter)
 
  UseGadgetList(WindowID(#window))
  ;SetActiveWindow(#window)
 
  ButtonGadget(4, 10,170, 200, 20, "кнопка из треда", #PB_Button_Toggle)
 
EndProcedure
 
If OpenWindow(#window, 100, 200, 195, 260, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
 
  ButtonGadget(0, 10, 10, 200, 20, "Standard Button")
  ButtonGadget(1, 10, 40, 200, 20, "Left Button", #PB_Button_Left)
  ButtonGadget(2, 10, 70, 200, 20, "Right Button", #PB_Button_Right)
  ButtonGadget(3, 10,100, 200, 60, "Multi-line Button  (longer text gets automatically wrapped)", #PB_Button_MultiLine)
 
  If CreateThread(@AlertThread(), 154)
    Debug "тред есть"
  EndIf
 
  Repeat
    Event = WaitWindowEvent()
 
    If Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button
      Quit = 1
    EndIf
 
  Until Quit = 1
 
EndIf
 
End   ; All the opened windows are closed automatically by PureBasic
 



без галки тредсейф - код без ошибки, но кнопка из треда не появляется на окне. если галку поставить - вылет. и опять таки кнопки нет :) ошибка типа нет текущего гаджет листа - как нет, когда я вроде указываю: UseGadgetList(WindowID(#window))

как в потоке нарисовать кнопку на окошке программы?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн мар 16, 2015 8:07 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 71 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Из потока можно работать только с окнами, которые созданы в ДАННОМ потоке. В твоем случае окно создается в главном потоке, а кнопку ты приделываешь во втором потоке. Единственный вариант, который я здесь вижу - создать уже скрытую кнопку, а в потоке просто показать её
Код:
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
Enumeration
  #window
EndEnumeration
 
Procedure AlertThread(Parameter)
  HideGadget(4, 0)
EndProcedure
 
If OpenWindow(#window, 100, 200, 195, 260, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
 
  ButtonGadget(0, 10, 10, 200, 20, "Standard Button")
  ButtonGadget(1, 10, 40, 200, 20, "Left Button", #PB_Button_Left)
  ButtonGadget(2, 10, 70, 200, 20, "Right Button", #PB_Button_Right)
  ButtonGadget(3, 10,100, 200, 60, "Multi-line Button  (longer text gets automatically wrapped)", #PB_Button_MultiLine)
  ButtonGadget(4, 10,170, 200, 20, "кнопка из треда", #PB_Button_Toggle)
  HideGadget(4, 1)
 
  If CreateThread(@AlertThread(), 154)
    Debug "тред есть"
  EndIf
 
  Repeat
    Event = WaitWindowEvent()
 
    If Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button
      Quit = 1
    EndIf
 
  Until Quit = 1
 
EndIf
 
End   ; All the opened windows are closed automatically by PureBasic


_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт мар 17, 2015 7:46 am 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1766
Откуда: Алматы
Благодарил (а): 17 раз.
Поблагодарили: 49 раз.
Пункты репутации: 5
это то я догадался... но все-таки фигня получается :) даже удалить в потоке нельзя. бред какой-то :) freegadget тоже не работает.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт мар 17, 2015 4:51 pm 
Не в сети
доцент

Зарегистрирован: Сб янв 19, 2013 9:48 am
Сообщений: 35
Благодарил (а): 0 раз.
Поблагодарили: 10 раз.
Код:
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
Enumeration
        #window
EndEnumeration
 
Procedure AlertThread(Parameter)
        PostEvent(#PB_Event_FirstCustomValue)
EndProcedure
 
If OpenWindow(#window, 100, 200, 195, 260, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
       
        ButtonGadget(0, 10, 10, 200, 20, "Standard Button")
        ButtonGadget(1, 10, 40, 200, 20, "Left Button", #PB_Button_Left)
        ButtonGadget(2, 10, 70, 200, 20, "Right Button", #PB_Button_Right)
        ButtonGadget(3, 10,100, 200, 60, "Multi-line Button  (longer text gets automatically wrapped)", #PB_Button_MultiLine)
       
        If CreateThread(@AlertThread(), 154)
                Debug "тред есть"
        EndIf
       
        Repeat
                Event = WaitWindowEvent()
                Select Event
                        Case #PB_Event_FirstCustomValue
                                Debug "#PB_Event_FirstCustomValue"
                                ButtonGadget(4, 10,170, 200, 20, "кнопка из треда", #PB_Button_Toggle)
                EndSelect
        Until Event = #PB_Event_CloseWindow
       
EndIf
 
End



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт мар 20, 2015 8:07 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 71 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Здравствуйте! Прошу помочь, так как я в этих всем мютексах и семафорах вообще дуб дубом... Если упростить задачу, то выходит так.
Есть один глобальный список, с которым работают хотя бы 2 потока (их может быть и больше, но чтоб мне понять принцип, пусть будет 2). Все потоки работают с этим списком одновременно. Как правильно все это организовать (семафоры, мютексы), чтобы не было одновременных попыток доступа и т.д. Чтоб было понятно, приведу пример. Простейший код
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Global var = 0
 
Procedure th(*v)
  Protected i
  For i = 1 To 1000
    var = var + 1
  Next
EndProcedure
 
For i = 0 To 4
  CreateThread(@th(), 1)
Next
 
Delay(5000)
 
Debug var

В конце переменная должна быть равна 5000, но она всегда меньше. Я так полагаю, есть попытки одновременной записи в переменную с нескольких потоков, и они просто блокируются

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт мар 20, 2015 8:56 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1766
Откуда: Алматы
Благодарил (а): 17 раз.
Поблагодарили: 49 раз.
Пункты репутации: 5
я поставил галку тредсейф и выдало 5000. без галки - 4996 где-то так...


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

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


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

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


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

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