Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Power Basic

Страница: 1 | 2 | 3 |

 

  Вопрос: Тактика построения программы с GUI - ? Добавлено: 04.04.06 16:33  

Автор вопроса:  XPEHOMETP

Ответить

  Ответы Всего ответов: 36  

Номер ответа: 16
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #16 Добавлено: 09.04.06 23:27
А если это строка?

Какая строка?
Насколько я понимаю, адрес, который записывается в глобальную - это дворд, а не строка :))) и пишется разом, одной инструкцией, а не побайтно.

И буду его замораживать, поскольку вычисления в основном потоке пойдут довольно громоздкие

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

Ответить

Номер ответа: 17
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #17
Добавлено: 10.04.06 09:05
Зачем тогда глупый МС придумал InterlockedIncrement и т.п.?

Ответить

Номер ответа: 18
Автор ответа:
 silently_fox



ICQ: 257821932 

Вопросов: 5
Ответов: 9
 Профиль | | #18 Добавлено: 10.04.06 19:14
Оповещение интерфейсного потока а том что рабочий поток завершил
обработку данных через оконные сообщения(думаю как раз для решения твоей задачи):


#compile exe
#dim all
#include  "win32API.inc"

%BUTTON_WORK = 100

type SomeData_struct
    data1 as asciiz * 20
    data2 as dword
    data3 as double
end type

global AM_WORK_COMPLETE as dword

declare function WorkThreadMain(byval wParam as long) as long
'/////////////////////////////////////////////////////////////////////////////////////////////

function pbmain() as long

    local hdlg  as dword

    AM_WORK_COMPLETE=RegisterWindowMessage(byref "WORK_COMPLETE";)
    if(AM_WORK_COMPLETE=%null)then AM_WORK_COMPLETE=%WM_USER+10

    dialog new %HWND_DESKTOP,"test",,,300,200,%WS_CAPTION or %DS_MODALFRAME or %WS_SYSMENU to hdlg
    control add button, hdlg, %BUTTON_WORK, "Work!", 230, 170, 60, 20, %BS_CENTER
    dialog show modal hdlg call WindowMain

end function

'/////////////////////////////////////////////////////////////////////////////////////////////

callback function WindowMain() as long

    static hWorkThread  as dword
    local  result       as long
    local  SomeData     as SomeData_struct ptr

    select case cbmsg

        case %WM_COMMAND
            select case lo(word,cbwparam)
                case %BUTTON_WORK

                    'замораживаем пипочку
                    EnableWindow(cblparam,%false)
                    control set text cbhndl,%BUTTON_WORK, "Please Wait"
                    'создаем рабочий поток
                    thread create WorkThreadMain(cbhndl) to hWorkThread

            end select

        case AM_WORK_COMPLETE 'обработка данных завершена

            'в cbwparam - адрес данных
            SomeData=cbwparam
            msgbox @SomeData.data1,,"Work complete"
            'не пытайся закрыть дескриптор рабочего потока прежде чем отобразишь данные
            'после уничтожения стека потока данные станут недоступны

            'закрываем дескриптор потока, давая возможность системе освободить память
            thread close hWorkThread to result
            'размораживаем пипочку
            EnableWindow(GetDlgItem(cbhndl,%BUTTON_WORK),%true)
            control set text cbhndl,%BUTTON_WORK, "Work!"

    end select

end function

'/////////////////////////////////////////////////////////////////////////////////////////////

function WorkThreadMain(byval wParam as long) as long
'можешь вызывать сколько процедур обработки
'SomeData будет для них глобальной в контексте данного потока(PB использует TLS)
threaded  SomeData as SomeData_struct
    'обработка
    '...
    SomeData.data1="hello"
    PostMessage(wParam,AM_WORK_COMPLETE,varptr(SomeData),0)
'еще кое что - не пытайся завершить поток вызовом ExitThread или TerminateThread
'он должен завершиться сам сабой т.е. end function
end function

'/////////////////////////////////////////////////////////////////////////////////////////////

Ответить

Номер ответа: 19
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #19 Добавлено: 10.04.06 19:54
Sharp
Ты знаешь ситуации, когда mov dword ptr[xxx],yyy может быть прервана в момент, когда ptr[xxx] будет записана к примеру на 37% ??? И будет передано управление другому потоку??? Ха-ха-ха...
Все биты адреса будут вписаны одновременно, пора бы уже знать это. И ситуации "недописаного адреса" в принципе не может быть. Так что опасения чтения "недозаписаного" адреса - это глупости.

Ответить

Номер ответа: 20
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #20
Добавлено: 11.04.06 10:24
Ты знаешь ситуации, когда mov dword ptr[xxx],yyy может быть прервана в момент, когда ptr[xxx] будет записана к примеру на 37% ??? И будет передано управление другому потоку??? Ха-ха-ха...
А представь себе ситуацию, когда DWORD из памяти в кэш уже загружен, а тут другой поток тоже что-то хочет сделать с этим DWORD :P

Ответить

Номер ответа: 21
Автор ответа:
 XPEHOMETP



Вопросов: 3
Ответов: 30
 Профиль | | #21 Добавлено: 11.04.06 15:33
У, какая драка заварилась из-за моего поста! Спасибо за примерчики, постараюсь разобраться!

Ответить

Номер ответа: 22
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #22 Добавлено: 11.04.06 19:52
Sharp
Почитай матчасть, что такое потоки, их переключение, как работает этом механизм и т.д.

Ответить

Номер ответа: 23
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #23
Добавлено: 11.04.06 22:37
Почитай Рихтера, там содержится вся нужная тебе матчасть, которую я тебе вкратце осветил. Часть II, глава 8.

Ответить

Номер ответа: 24
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #24 Добавлено: 11.04.06 23:05
У меня проги от использования глобальных не падают :)
Так что пусть читает тот, кто не знает, как с ними обращаться.

P.S.
Рихтер тоже адреса передаёт как строки?

Ответить

Номер ответа: 25
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #25
Добавлено: 12.04.06 11:59
на счёт PB сказать не могу, как там со строками. а вот допустим строка в сегменте данных обрабатывается строковой функцией, которая модифицирует текст, но не изменяет положение строки в памяти, т.е. старый указатель остается актуальным. так вот тут может всплыть несостыковочка. другое дело, что разработчики PB, я полагаю, при переприсваивании строк и при использовании всех встроенных текстовых функций на новую строку каждый раз дают другой указатель.

то, что писал Рихтер, возможно надо отнести только насчёт конкретного компилятора С/С++. хотя не буду утверждать, я ещё не прочитал этой главы.

Ответить

Номер ответа: 26
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #26
Добавлено: 12.04.06 12:07
HOOLIGAN, грубо говоря если я на асме в одном потоке буду постоянно менять строку в .data (в цикле, например, побайтно), а в другом по таймеру это выводить, то другой поток будет получать все промежуточные варианты работы моей строковой функции, т.е. например наполовину выполненный replace. На эту ошибку я могу попасться в асм (теперь знаю и не попадусь), а в PB используя встроенные строковые функции этого произойти не должно.

Ответить

Номер ответа: 27
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #27
Добавлено: 12.04.06 13:58
У меня проги от использования глобальных не падают :)
Так что пусть читает тот, кто не знает, как с ними обращаться.

У меня тоже не падают, так что если это мне, то не в кассу.
P.S.
Рихтер тоже адреса передаёт как строки?

Вот тебя и попалили, нечитавший Рихтера :)

Ответить

Номер ответа: 28
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #28
Добавлено: 12.04.06 14:11
на счёт PB сказать не могу, как там со строками. а вот допустим строка в сегменте данных обрабатывается строковой функцией, которая модифицирует текст, но не изменяет положение строки в памяти, т.е. старый указатель остается актуальным. так вот тут может всплыть несостыковочка. другое дело, что разработчики PB, я полагаю, при переприсваивании строк и при использовании всех встроенных текстовых функций на новую строку каждый раз дают другой указатель.

 В PB тоже есть такие (с фиксированным адресом), Asciiz называется. Ну а динамические строки можно в любом языке использовать, хоть в MASM хоть в чём угодно. Только тебе прийдётся заморачиваться с API из OLE32.DLL, в то время как в VB/PB этим занимаются компиляторы. Пошарь по сети на предмет примеров использования OLE-строк в MASM, скорее всего они в инете есть.

Ответить

Номер ответа: 29
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #29 Добавлено: 12.04.06 19:37
Да при чем тут строки???
Sharp ляпнул невпопад о строках, и понеслось :(
Чел изменяет ОДИН ДВОРД ! И всё! Никаких неувязок при чтении/записи этого дворда из разных потоков быть не может.

Ответить

Номер ответа: 30
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #30
Добавлено: 12.04.06 20:41
Очень даже впопад - любые обращения к глобальным ресурсам и переменным надо оборачивать в критические секции, чтобы при рефакторинге не мучаться поиском неизвестно откуда вылетающих ошибок - сейчас это может быть и mov dword ptr, imm32, а в будущем он может и поменять его на какое-нибудь вычисление и т.п.

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам