purebasic.info

PureBasic forum
Текущее время: Ср июн 19, 2019 12:32 am

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




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: передача строки в Поток
СообщениеДобавлено: Чт июн 18, 2015 12:05 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 18, 2009 3:41 am
Сообщений: 1126
Благодарил (а): 86 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
вроде элементарная задача, но я на ней сломался :D

1) подскажите пожалуйста, как передать строку в поток?

2) что не так с этим кодом, почему первая буква А "теряется", и вылетают кракозябры, т.е. что я делаю не так :roll: ?:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Procedure WDF(*DIW)
  Debug PeekS(*DIW)
EndProcedure
 
Procedure STLD()
Protected str.s
    For i = 65 To 75
        str = Chr(i)
            *pointerStr=AllocateMemory(Len(str))
              PokeS(*pointerStr,Str)
                CreateThread(@WDF(), *pointerStr)
            FreeMemory(*pointerStr)
    Next
EndProcedure
 
STLD()
 
Delay (2000)



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: передача строки в Поток
СообщениеДобавлено: Чт июн 18, 2015 12:25 pm 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 283
Благодарил (а): 40 раз.
Поблагодарили: 28 раз.
Пункты репутации: 0
так работает, но это все равно не фонтан. :? нужна человеческая синхронизация, однако.
пример нормальной работы с потоками тут http://purebasic.info/phpBB3ex/viewtopic.php?f=10&t=4108
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Procedure WDF(*DIW)
  Debug PeekS(*DIW)
EndProcedure
 
Procedure STLD()
Protected str.s
    For i = 65 To 75
        str = Chr(i)
            *pointerStr=AllocateMemory(Len(str)+SizeOf(Character)) ;+ завершающий 0 (или 00)
              PokeS(*pointerStr,Str)
              CreateThread(@WDF(), *pointerStr)
              Delay(5) ;запуск потока требует времени, а вы следующей строкой память очищаете )))  
            FreeMemory(*pointerStr) ;тут вы очищаете память, а вы уверены, что поток уже считал вашу строку?
    Next
EndProcedure
 
STLD()
 
Delay (2000)



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: передача строки в Поток
СообщениеДобавлено: Чт июн 18, 2015 12:30 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
Procedure WDF(*Param.String)
  Debug *Param\s
  ClearStructure(*Param, String)
  FreeMemory(*Param)
EndProcedure
 
Procedure STLD()
  For i = 65 To 75
    *Param.String = AllocateMemory(SizeOf(String))
    *Param\s = Chr(i)
    CreateThread(@WDF(), *Param)
    Delay(50) ;Чтобы поток успевал завершится и вывод букв был по порядку
  Next
EndProcedure
 
STLD()
 
Delay (2000)


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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: передача строки в Поток
СообщениеДобавлено: Чт июн 18, 2015 12:32 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 18, 2009 3:41 am
Сообщений: 1126
Благодарил (а): 86 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
Благодар Всем !
Чего-то меня задержки эти напрягают, пришлось уйти к структуре :?
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Structure qwerty
  str1.s
  num.l
EndStructure
 
Procedure WDF(*DIW.qwerty)
  Debug Str(*DIW\num) + "  -  " + *DIW\str1
EndProcedure
 
Procedure STLD()
Protected str.s
    For i = 65 To 75
        str = Chr(i)
          *stertTh.qwerty=AllocateMemory(SizeOf(qwerty))
          *stertTh\num=i
          *stertTh\str1=str
        CreateThread(@WDF(), *stertTh)
    Next
EndProcedure
 
STLD()
 
Delay (2000)



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: передача строки в Поток
СообщениеДобавлено: Чт июн 18, 2015 12:35 pm 
Не в сети
PureBasic Coder
Аватар пользователя

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

P.S. А память кто очищать будет?
Код:
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
Structure qwerty
  str1.s
  num.l
EndStructure
 
Procedure WDF(*DIW.qwerty)
  Debug Str(*DIW\num) + "  -  " + *DIW\str1
  ClearStructure(*DIW, qwerty) ;Очищаем память
  FreeMemory(*DIW)
EndProcedure
 
Procedure STLD()
  Protected str.s, th.l
  For i = 65 To 75
    str = Chr(i)
    *stertTh.qwerty=AllocateMemory(SizeOf(qwerty))
    *stertTh\num=i
    *stertTh\str1=str
    th = CreateThread(@WDF(), *stertTh)
    WaitThread(th) ;Ждём завершения потока
  Next
EndProcedure
 
STLD()
 
Delay (2000)


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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: передача строки в Поток
СообщениеДобавлено: Чт июн 18, 2015 12:37 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 18, 2009 3:41 am
Сообщений: 1126
Благодарил (а): 86 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
[quote="Никита Однороб"][/quote]
мне порядок не важен, важно чтобы всё в целости передалось в поток )

кстати, после выделения памяти (для структуры), тоже походу надо очистить будет память :? (увидел, ты это уже спросил )))


Последний раз редактировалось registrymechanic Чт июн 18, 2015 12:38 pm, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: передача строки в Поток
СообщениеДобавлено: Чт июн 18, 2015 12:38 pm 
Не в сети
PureBasic Coder
Аватар пользователя

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

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: передача строки в Поток
СообщениеДобавлено: Чт июн 18, 2015 1:18 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11480
Благодарил (а): 4 раз.
Поблагодарили: 468 раз.
registrymechanic писал(а):
что я делаю не так
"Не так" в том что ты освобождаешь память до того как ее прочитает поток. В твоем коде нужно освобождать память в потоке.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Procedure WDF(*DIW)
  Debug PeekS(*DIW)
  FreeMemory(*DIW)
EndProcedure
 
Procedure STLD()
  Protected str.s
  For i = 65 To 75
    str = Chr(i)
    *pointerStr=AllocateMemory(Len(str))
    PokeS(*pointerStr,Str)
    CreateThread(@WDF(), *pointerStr)
  Next
EndProcedure
 
STLD()
 
Delay (2000)


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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: передача строки в Поток
СообщениеДобавлено: Чт июн 18, 2015 1:58 pm 
Не в сети
профессор
Аватар пользователя

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

Чтобы передать, лучше глобальную переменную мьютексом обтянуть.
А чтобы запустить с параметром, в прочем это уже реализовано.

Вот передача в запущенный поток, не самый удачный пример, но смысл думаю будет понятен
Код:
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
Global GlobalStrToThread.s
 
Global MutexToStr = CreateMutex()
 
Procedure.s ReadGlobalStr()
  LockMutex(MutexToStr)
  result.s = GlobalStrToThread.s
  UnlockMutex(MutexToStr)
  ProcedureReturn result
EndProcedure
 
Procedure WriteGlobalStr(str.s)
  LockMutex(MutexToStr)
  GlobalStrToThread.s = str.s
  UnlockMutex(MutexToStr)
EndProcedure
 
Procedure WDF(fignia)
  StopMls = Date()+2
  str.s = ReadGlobalStr()
  Repeat
    If str <> ReadGlobalStr()
      str = ReadGlobalStr()
      Debug str
      Delay(1)
    EndIf
  Until Date()>=StopMls
EndProcedure
 
Procedure STLD()
  CreateThread(@WDF(), 777)
  Delay(10)
  For i=65 To 75
    WriteGlobalStr(Chr(i))
    Delay(1)
  Next i
EndProcedure
 
STLD()
 
Delay (2000)


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


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

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


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

Сейчас этот форум просматривают: Bing [Bot] и гости: 2


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

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