PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка (продолжение…)


Вопросы новичка (продолжение…)

Сообщений 481 страница 510 из 974

481

Спасибо, Дмитрий

0

482

Друзья! Выручайте. Нарисовал лист бокс с использованием лист виев с флагом ownerdraw с использованием обработчика событий, все красиво все замечательно. Не могу отследить двойное нажатие на левую кнопку мыши, уже все волосы на голове вырвал. Код в студию не могу выложить, ибо с телефона пишу.

0

483

Если показал бы код, было бы проще посоветовать, а то ведь даже не указал создаешь ListBos с помощью WinAPI или гаджетов пурика.

Пока что могу посоветовать добавить к код это:

Код:
SetClassLong_(hWnd, #GCL_STYLE, #CS_DBLCLKS)

hWnd - хэндл лист-бокса.

0

484

Петр, твой вариант не подошел, жаль. Создавался листбокс средствами пурика.

0

485

Как отслеживаешь двойной клик?

0

486

Через обработчик событий " Select msg
Case #PB_EVENTTYPE_LEFTDOUBLECLICK... и т.д"

0

487

Попробуй в обработчике событий лист-бакса отлавливать сообщение #WM_LBUTTONDBLCLK

0

488

Пытался, ноль эмоций, не видит он его :-(

0

489

Скажите пожалуйста, мне надо в переменную записать строку кода для purebasic. И эта строка кода содержит символ ".

Код:
peremennay$=" a$="ppp" "

Ну и истественно выскакивает ошибка. Скажите пожалуйста, может в PB какие нибудь спейиальные кавычки предусмотрены специально для таких случиев?

0

490

Appolon
Замени кавычки на Chr(34).
peremennay$=" a$="+Chr(34)+"ppp"+Chr(34)+" "

Отредактировано lakomet (06.05.2011 05:31:01)

0

491

Здравствуйте, у меня вопрос про shared, не понимаю, как она работает. Вот, к примеру, у меня есть процедура АА, внутри неё объявляю переменные, которые должны быть видимы только в этой процедуре и внутри тех процедур, которые используются внутри  АА, shared предоставляет доступ к переменной, как будто она глобальная, или же делает её глобальной? Поскольку когда я делаю так, то эти переменные становятся видимы и во вне процедуры AA.

0

492

goodwen написал(а):

вопрос про shared,

shared - значит общий, т.е. общая ( как глобальная) переменная, но объявленная внутри процедуры.
Для глобализации внутри прoцедуры подойдет Static

0

493

ВиниПур, вот использую static и не помогает, в чём ошибка?

Код:
Procedure a()
  Static proc1.l=20
EndProcedure

Procedure b()
  Static proc2.l
  ;Static proc1.l
  proc2=proc1+20
  Debug proc2
EndProcedure

Procedure obwaia(); общая процедура
  a(); здесь proc1 = 20
  b(); здесь proc2 = 40
  Debug proc2
EndProcedure

obwaia()

global мне здесь не подойдёт.

Отредактировано goodwen (08.05.2011 14:03:19)

0

494

Код:
Procedure a()
  Static proc1.l=20
  ProcedureReturn proc1
EndProcedure

Procedure b(*proc1)
  Static proc2.l
  ;Static proc1.l
  proc2=PeekL(*proc1)+20
  ;Debug proc2
  ProcedureReturn proc2
EndProcedure

Procedure obwaia(); общая процедура
  proc1=a(); здесь proc1 = 20
  proc2=b(@proc1); здесь proc2 = 40
  Debug proc1
  Debug proc2
EndProcedure

obwaia()

0

495

Пётр, спасибо.

0

496

ребята как сделать нечто подобное!?!?

0

497

Тут посмотри http://programmersforum.ru/showthread.p … post324326

0

498

Петр спасибо за ссылку =) но дело в том что именно там я и увидел эту тему, пытался зарегистрироваться на этом форуме(два раза) не получилось. Из-за этого не могу скачать исходник. Петр если можешь выложи код =) очень нужно

0

499

Код:
; Программа написанна на языке PureBasic

Global Font.l ; Глобальная переменная (доступная в процедуре)

; В этой процедуре отрисовывается график.
; Она запущена в параллельном потоке
Procedure Draw_Image()
Static Sinus ; Статическая перемена, данные в котрой не теряются при завершении работы процедуры
Y_Number=40 ; Это для выводимого текст в графике
X_Number=0

   If StartDrawing(ImageOutput(1)) ; Приступаем к рисованиию по рисунку
     DrawingFont(Font) ; Шрифт для отобрадения текста
     Box(0,0,430,430,$FFFFFF) ; Стираем всё в рисунке
     DrawingMode(#PB_2DDrawing_Transparent)
     
       For x = 10 To 387 Step 43 ; Создание горизонтальных линий
        LineXY(40,x,384,x,$7BD055) ; Линия 
         If X_Number=20 ; Жиная линия в центре
            LineXY(40,x-1,384,x-1,$7BD055) 
            LineXY(40,x+1,384,x+1,$7BD055) 
         EndIf
        DrawText(x+30, 360, Str(X_Number), $82057D) ; Текст скраю графика
        X_Number+5
       Next x 
       
       For y = 40 To 387 Step 43 ; Создание вертикальных линий
        LineXY(y,10,y,353,$7BD055)  ; Линия 
        DrawText(16, y-38, Str(Y_Number), $F60209) ; Текст скраю графика
        Y_Number-10 
       Next y 
       
       For x = 40 To 383 ; Создание синусоиды
         theta = x + Sinus 
         y=((383-4)/2-10)-Sin(theta/58)*(383/2-10)*(Cos(theta/58)) ; Вычисление оси Y
         Box(x,y,4,4, $4A02B5) ; Точка
       Next x
       Sinus+2 ; Сдиг синусоиды
       
     StopDrawing() ; Конец рисования
     SetGadgetState(1, ImageID(1)) ; Отображение результата в окне
   EndIf
  
EndProcedure

Image=CreateImage(1,410,390) ; Создание рисунка для графика
; Создание невидимого окна
OpenWindow(0,0,0,420,400,"Ослциллограф",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_Invisible)
 ImageGadget(1,5,5,390,390, Image) ; Здесь будет отображаться рисунок графиком 

CompilerIf #PB_Compiler_OS = #PB_OS_Linux ; Это для Linux
  Font=LoadFont(1,"Liberation Mono ",8) ; Шрифт для Linux
  Procedure LinuxTim(*p)
   Draw_Image()
   g_timeout_add_(20, @LinuxTim(), WindowID(0));
  EndProcedure
  g_timeout_add_(20, @LinuxTim(), WindowID(0))
CompilerElse ; Это для Windows
  Font=LoadFont(2,"Arial",8) ; Шрифт для Windows
  SetTimer_(WindowID(0), 1, 20, @Draw_Image())
CompilerEndIf
Draw_Image()
HideWindow(0,0)
Repeat ; Главный цикл программы Repeat - Until
  Event=WaitWindowEvent() ; Узнаём ID события программы
Until Event=#PB_Event_CloseWindow ; Прерывание цикла при закрытии окна

0

500

Большое спасибо Петр.

0

501

Доброго времени суток. Появилась кое какая идея, и тут же встал вопрос: воспроизвести потоковый звук довольно просто, с помощью библиотек bass.dll или fmod.dll, а как собственно его передать?

0

502

Дмитрий написал(а):

воспроизвести потоковый звук довольно просто, с помощью библиотек bass.dll или fmod.dll, а как собственно его передать?

Можно и средствами пурика это сделать Интернет-радио

Если интересуют именно bass.dll или fmod.dll, то вот примеры:
Рисованный интерфейс FM (bass.dll)
http://purebasic.info/phpBB2/viewtopic.php?t=1204 (fmod.dll)
http://purebasic.info/phpBB2/viewtopic.php?t=947 (bass.dll)
http://purebasic.info/phpBB2/viewtopic.php?t=1581 (Bass.dll)

0

503

http://purebasic.ucoz.com/publ/bass_dll … /1-1-0-136  (bass.dll)

0

504

Петр , Мирашик! Вы, наверное, меня не так поняли. С воспроизведением потокового звука проблем нет, об этом куча инфы и примеров. А как передать поток звука на клиентскую часть через TCP/IP ну а на клиентской стороны уже воспроизвести уже известным способом. Нужно СОЗДАТЬ ПОТОК =)

0

505

Тут определенно нужно создавать сервер (скорее всего многопоточный, если клиентов будет много), который будет передавать данные клиенту со строго заданной скоростью, скажем, 256 кб/с.

0

506

Сервер будет расчитан на 2 клиента, тут без проблем! То есть можно просто мп3 файл передавать клиенту и он будет в режиме реального времени воспроизводить предположим испольуя фмод.длл!?!? или обычной передачей файла не обойтись!?!?

0

507

Можно файл передавать, должно получится, но нужно пробовать.

0

508

"...который будет
передавать данные клиенту со строго заданной скоростью, скажем,
256 кб/с." как собственно установить заданную скорость. Мне это не требуется, но для общего развития пригодится.

0

509

Дмитрий написал(а):

как собственно установить заданную скорость

В простейшем случае, просто передавать требуемое число байт за определенный промежуток времени, скажем за секунду.
Если было передано больше байт - прекращать передачу до окончания текущей секунды.

0

510

Здравствуйте, у меня возникла проблема с написанием простенькой программы по передачи сообщений от одного потока другому. Там идея такая, есть 4 потока отсылающие друг другу сообщения и принимающие это и в Debug отображается кому и от кого прищло сообщение, сначала с помощью рандома узнаем, поток отправит сообщение, или примет. Если 1, то отправляем сообщение с помощью процедуры send, а если принять сообщения, тогда используется процедура receive. Ниже приведён код программы. Вроде всё работает, но в определённый момент отчёт перестаёт выводится на экран будто ничего не происходит, но программы не завершается, в чём может быть проблема? Если я переношу использование Мьютекса и Семафора из кода потока в код процедур send и receive и тоже самое происходит.

Код:
Global true.b = 1                         ; переменная для вычного цикла
Global semaphore = CreateSemaphore()      ; объявление переменной semaphore, которая является семафором
Global mutex     = CreateMutex()          ; объявление переменной mutex, которая является мьютексом     

Structure messagebox
  sender.l                                ; номер потока, который отправляет сообщение
  recipient.l                             ; номер потока, которому нужно отпарвить сообщение
  message_body.s                          ; само сообщение
EndStructure
 
Global NewList queue.messagebox()        ; объявление списка queue, в который записываются сообщения 

Procedure send(sender_thread.l, recipient_thread.l, message.s)
  
  ; send - посылает сообщение заданному потоку
  ; sender_thread - какой поток отсылает сообщение
  ; recipient_thread - какому потоку отослать сообщение
  ; message - само сообщение
  
  LastElement(queue())                     ; переходим к последнему элементу в списке
  AddElement(queue())                      ; добавить новый элемент в список
   
  queue()\sender = sender_thread           ; пишем какой поток хочет отослать
  queue()\recipient = recipient_thread     ; пишем какому потоку хотим отправить сообщение
  queue()\message_body = message           ; само сообщение
EndProcedure

Procedure.s receive(recipient_message.l)
  
  ; receive - получет сообщение от другого потока
  ; recipient_message - номер потока, который хочет получить сообщение

  message.s = ""                           ; переменная для записи всех сообщений, которые пришли данному потоку
  
  ForEach queue()                         ; смотрим какие у нас данные в списке
    
    If queue()\recipient = recipient_message       ; если это сообщение направлено данному потоку
      ; записываем все сообщения, которые были отосланы этому потоку
      message = message + "поток " + Str(recipient_message) + " принял: " + queue()\message_body + " от потока " + Str(queue()\sender) + "; "  
      DeleteElement(queue())                             ; Удаление текущего элемента в списке
    EndIf
    
  Next

  ProcedureReturn message.s
EndProcedure

Procedure Thread(*number)
  
  counter.i = 0                                      ; переменная для данных (их отображение) 
  
  While true = 1 
    
    Delay(1000)
    send_of_receive.l = Random(1)                     ; здесь случаенно определяется, поток хочет послать, или принять сообщение
    
    If send_of_receive = 1                            ; если 1, значит отослать
      
      LockMutex(mutex)                                ; входим в критическую секцию, с помощью мьютекса
    
      send_thread.l = Random(3)                       ; узнаём какому потоку послать сообщение
      data_message.s = "message" + Str(counter)       ; присвоить этому элементу значение
      counter = counter + 1                           ; увеличиваем значение переменной, чтобы различать данные

      send(send_thread.l, *number, data_message.s)     ; отправить сообщение указанному потоку
      
      UnlockMutex(mutex)                              ; выходим из критической секции, с помощью мьютекса
      SignalSemaphore(semaphore)                      ; увеличиваем значение семафора
    Else                                              ; иначе получаем сообщение
      
      LockMutex(mutex)                                 ; входим в критическую секцию, с помощью мьютекса
      
      received_message.s = receive(*number)            ; получаем сообщения
      
      If Not received_message = ""                       ; если этому потоку ни кто сообщения не посылал, то ничего и не выводим
         Debug received_message
      EndIf
    
      UnlockMutex(mutex)                                   ; выходим из критической секции, с помощью мьютекса  
      WaitSemaphore(semaphore)                             ; уменьшаем значение семафора
    EndIf
    
  Wend 
EndProcedure

thread0 = CreateThread(@Thread(), 0)   ; создать поток thread1
thread1 = CreateThread(@Thread(), 1)   ; создать поток thread2
thread2 = CreateThread(@Thread(), 2)   ; создать поток thread3
thread3 = CreateThread(@Thread(), 3)   ; создать поток thread2

  
WaitThread(thread0)      
WaitThread(thread1)
WaitThread(thread2)
WaitThread(thread3)

Отредактировано goodwen (26.05.2011 00:12:59)

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка (продолжение…)