SendMessage должно валить программы!

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

SendMessage должно валить программы!

Сообщение ANDLL » 20.06.2005 (Пн) 14:14

Я вот тут в связи с этой темой задумался :scratch:

MSDN писал(а):The SendMessage function sends the specified message to a window or windows. It calls the window procedure for the specified window and does not return until the window procedure has processed the message.


Если сообщение посылается окну, пренадлежащему другому процессу, то SendMessage должно создавать отдельный поток(что-то типа RemoteThread) для обработчика этого сообщения.(Ведь не может же SendMessage просто взывать какую-то функцию в текущем потоке?) А что если программа, которой посылают сообщение написана на VB? И если обработчик этого сообщения содержит те VB-функции, которые не могут выполнятся в отдельном потоке?
На деле этого не происходит, но что тогда делает SendMessage???
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 20.06.2005 (Пн) 14:37

После некоторых размышлений, я пришел к выводу, что SendMessage делает следующее:
Код: Выделить всё
if(окно принадлежит вызывающему потоку) then
   вызываем функцию
else
   помещаем сообщение в очередь и ждем его обработки
end if

Что, признаться несколько расходится с написанным в MSDN...
Но ничего другого на ум не приходит... Может подскажете другой возможный вариант?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.06.2005 (Пн) 17:16

Нефиг читать первые два предложения статьи MSDN :)
Там ещё секция remarks есть.

MSDN писал(а):If the specified window was created by the calling thread, the window procedure is called immediately as a subroutine. If the specified window was created by a different thread, the system switches to that thread and calls the appropriate window procedure. Messages sent between threads are processed only when the receiving thread executes message retrieval code. The sending thread is blocked until the receiving thread processes the message. However, the sending thread will process incoming nonqueued messages while waiting for its message to be processed. To prevent this, use SendMessageTimeout with SMTO_BLOCK set. For more information on nonqueued messages, see Nonqueued Messages.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 20.06.2005 (Пн) 17:31

Да, и вправду.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 21.06.2005 (Вт) 7:50

Вот, вот, Remarks часто любит обламать. Помню я когда-то отсылал какой то message task manager'у и он вылетал, с критической ошибкой.
الفيجوال بيسك الرابح

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 23.06.2005 (Чт) 21:49

ANDLL писал(а):После некоторых размышлений, я пришел к выводу, что SendMessage делает следующее:
Код: Выделить всё
if(окно принадлежит вызывающему потоку) then
   вызываем функцию
else
   помещаем сообщение в очередь и ждем его обработки
end if


Собственно, именно так всё и работает. Только "очередь", в которую кладётся сообщение - не та очередь, с которой работает GetMessage, а другая.
Изображение


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

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

    TopList  
cron