Какая строка?
Насколько я понимаю, адрес, который записывается в глобальную - это дворд, а не строка )) и пишется разом, одной инструкцией, а не побайтно.
И буду его замораживать, поскольку вычисления в основном потоке пойдут довольно громоздкие
ну тогда будь готов, что окно не будет ни на что реагировать, в т.ч. не будет перерисовываться. Вполне возможно (в зависимости от того, что сделает юзер) на экране будет серый прямоугольник вместо окна, либо вообще мазня, если он решит типа потянуть его в сторону
Оповещение интерфейсного потока а том что рабочий поток завершил
обработку данных через оконные сообщения(думаю как раз для решения твоей задачи):
#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
'/////////////////////////////////////////////////////////////////////////////////////////////
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
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!"
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
Sharp
Ты знаешь ситуации, когда mov dword ptr[xxx],yyy может быть прервана в момент, когда ptr[xxx] будет записана к примеру на 37% ??? И будет передано управление другому потоку??? Ха-ха-ха...
Все биты адреса будут вписаны одновременно, пора бы уже знать это. И ситуации "недописаного адреса" в принципе не может быть. Так что опасения чтения "недозаписаного" адреса - это глупости.
Ты знаешь ситуации, когда mov dword ptr[xxx],yyy может быть прервана в момент, когда ptr[xxx] будет записана к примеру на 37% ??? И будет передано управление другому потоку??? Ха-ха-ха...
А представь себе ситуацию, когда DWORD из памяти в кэш уже загружен, а тут другой поток тоже что-то хочет сделать с этим DWORD :P
на счёт PB сказать не могу, как там со строками. а вот допустим строка в сегменте данных обрабатывается строковой функцией, которая модифицирует текст, но не изменяет положение строки в памяти, т.е. старый указатель остается актуальным. так вот тут может всплыть несостыковочка. другое дело, что разработчики PB, я полагаю, при переприсваивании строк и при использовании всех встроенных текстовых функций на новую строку каждый раз дают другой указатель.
то, что писал Рихтер, возможно надо отнести только насчёт конкретного компилятора С/С++. хотя не буду утверждать, я ещё не прочитал этой главы.
HOOLIGAN, грубо говоря если я на асме в одном потоке буду постоянно менять строку в .data (в цикле, например, побайтно), а в другом по таймеру это выводить, то другой поток будет получать все промежуточные варианты работы моей строковой функции, т.е. например наполовину выполненный replace. На эту ошибку я могу попасться в асм (теперь знаю и не попадусь), а в PB используя встроенные строковые функции этого произойти не должно.
на счёт PB сказать не могу, как там со строками. а вот допустим строка в сегменте данных обрабатывается строковой функцией, которая модифицирует текст, но не изменяет положение строки в памяти, т.е. старый указатель остается актуальным. так вот тут может всплыть несостыковочка. другое дело, что разработчики PB, я полагаю, при переприсваивании строк и при использовании всех встроенных текстовых функций на новую строку каждый раз дают другой указатель.
В PB тоже есть такие (с фиксированным адресом), Asciiz называется. Ну а динамические строки можно в любом языке использовать, хоть в MASM хоть в чём угодно. Только тебе прийдётся заморачиваться с API из OLE32.DLL, в то время как в VB/PB этим занимаются компиляторы. Пошарь по сети на предмет примеров использования OLE-строк в MASM, скорее всего они в инете есть.
Да при чем тут строки???
Sharp ляпнул невпопад о строках, и понеслось
Чел изменяет ОДИН ДВОРД ! И всё! Никаких неувязок при чтении/записи этого дворда из разных потоков быть не может.
Очень даже впопад - любые обращения к глобальным ресурсам и переменным надо оборачивать в критические секции, чтобы при рефакторинге не мучаться поиском неизвестно откуда вылетающих ошибок - сейчас это может быть и mov dword ptr, imm32, а в будущем он может и поменять его на какое-нибудь вычисление и т.п.