powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
24 сообщений из 49, страница 2 из 2
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
    #38876945
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

в маршале полезно указывать, какой параметр содержит длину и в каком направлении передаются данные
...
Рейтинг: 0 / 0
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
    #38876981
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилкакой параметр содержит длину и в каком направлении передаются данные
Это как?
Ну, cbData в принципе содержит длину lpData , хотя честно говоря cbData -параметр на мой взгляд излишний (вспомогательный), т.е. если массив то его длина и так известна. В VB6, имея указатель, я тупо читал память до '\0' -символа например.
Во всяком случае не-указание cbData (или указание неверного значения) к крашу посылателя не приведут и приниматель обычно может вытащить данные и без cbData.

Пытаюсь вот читать:
Маршалинг по умолчанию для массивов
но чет не нахожу ответа.
...
Рейтинг: 0 / 0
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
    #38877243
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче так и не понял как Dim lpData As Byte() лечить, оставлю Dim lpData As IntPtr,
собственно и в VB6 я всегда передавал именно указатель на первый элемент байт-массива

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
cds.lpData = VarPtr(StringToMas(str_id).ByteStr(0))

Public Type StringToChar
  ByteStr() As Byte
End Type

Public Function StringToMas(str As String) As StringToChar
  Dim data As StringToChar
  Dim temp As String
  Dim Ln As Long
  Dim i As Long
  Dim Ptr As Long
  temp = str
  Ln = Len(temp)
  ReDim data.ByteStr(0 To Ln)
  If Ln > 0 Then
    For i = 0 To Ln - 1
      data.ByteStr(i) = Asc(Mid(temp, i + 1, 1))
    Next i
  End If
  data.ByteStr(Ln) = 0
  StringToMas = data
End Function

===
Кстати интереса ради.
Апишная "W" (CharSet:=CharSet.Unicode)
это не UTF8
(собственно это очевидно).
Еще как понял В UTF8 EN-символ кодируется одним байтом, в "Unicode" все кодируется двумя байтами.
А какой ".Net " -кодировке соответствует "W"?

===ИзопропилЕсть форме(контроле) метод.
без разницы - из таймера Invoke делать или из другого потока. Нет никаких глюков. В UI потоке будет вызываться
Расшифруешь?
Слово "Invoke" мне пока мало о чем говорит.
Из таймера я могу написать:
Me.Text="My caption"
Me.Function()
А поток меня как я понимаю пошлет с такими претензиями.
Или как вызвать этот замечательный "UI поток" ну скажем из Form_Load, чтоб из него все чего хошь можно сделать было?
Простенький совсем пример можно?
...
Рейтинг: 0 / 0
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
    #38877342
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Простенький совсем пример можно?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 public partial class Form1 : Form
    {
        private delegate void MyDelegate(string parameter);
        public Form1()
        {
            InitializeComponent();
        }
        public void Do(string parameter)
        {
            this.Invoke(new MyDelegate(ui), parameter);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Do("ha-ha");  
        }
        private void ui( string parameter)
        {

        } 
    }


Дмитрий77А какой ".Net " -кодировке соответствует "W"?
что есть "соответсвует" ?
как маршаллинг опишешь так и будет.
символы и строки в .NET - UTF-16,
что в байтовых массивах живёт - заботы приложения.
...
Рейтинг: 0 / 0
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
    #38877435
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилДмитрий77А какой ".Net " -кодировке соответствует "W"?
что есть "соответсвует" ?
как маршаллинг опишешь так и будет.
символы и строки в .NET - UTF-16,
что в байтовых массивах живёт - заботы приложения.

В смысле отправляем так (у меня только два варианта:(1) CharSet.Unicode и (2) CharSet.ANSI -набор из .UTF8, UTF7 здесь отсутствует):


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
 <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
  Public Structure COPYDATASTRUCT_UNI
    Dim dwData As IntPtr ' additional 32 bit data to pass
    Dim cbData As Integer ' length in bytes of data pointed by lpData
    Dim lpData As String ' pointer to data to be passed to the receiving app. >
  End Structure

  Public Declare Unicode Function SendMessage_COPYDATASTRUCT_UNI Lib "user32" Alias "SendMessageW" _
   (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByRef lParam As COPYDATASTRUCT_UNI) As Integer

  Private Sub ButtonSendMeUNIOrig_Click(sender As Object, e As EventArgs) Handles ButtonSendMeUNIOrig.Click
    Dim cds As New COPYDATASTRUCT_UNI
    cds.dwData = CType(3, IntPtr) 'идентифицирует тип передаваемых данных
    cds.cbData = System.Text.Encoding.Unicode.GetByteCount(TextBoxSendMeUNI.Text)
    cds.lpData = TextBoxSendMeUNI.Text

    Call SendMessage_COPYDATASTRUCT_UNI(Me.Handle, WM_COPYDATA, Me.Handle, cds)

  End Sub



Ну, вот так удалось принять без искажений:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
  <StructLayout(LayoutKind.Sequential)>
  Public Structure COPYDATASTRUCT
    Dim dwData As IntPtr ' additional 32 bit data to pass
    Dim cbData As Integer ' length in bytes of data pointed by lpData
    Dim lpData As IntPtr ' pointer to data to be passed to the receiving app.
  End Structure

      Case WM_COPYDATA
        Dim the_str As String
        Dim cds As COPYDATASTRUCT = CType(Marshal.PtrToStructure(m.LParam, GetType(COPYDATASTRUCT)), COPYDATASTRUCT)
        Dim buffer(cds.cbData - 1) As Byte
        Marshal.Copy(cds.lpData, buffer, 0, cds.cbData)
        Using mstream As New IO.MemoryStream(buffer)
          Using reader As New IO.StreamReader(mstream, System.Text.Encoding.Unicode, True)
            the_str = reader.ReadToEnd()
          End Using
        End Using
        MsgBox(the_str & ";len=" & Strings.Len(the_str))
      Case Else
    End Select



Ну да, значит "W"=.Unicode=UTF-16 (как ты и сказал) -она значит и есть "классический Юникод".
...
Рейтинг: 0 / 0
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
    #38877470
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилДмитрий77Простенький совсем пример можно?...

Не понимаю мысли.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Public Class Form1

  Private Delegate Sub MyDelegate(parameter As String)

  Public Sub DoIt(parameter As String)
    Me.Invoke(New MyDelegate(AddressOf ui), parameter)
  End Sub

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    DoIt("ha-ha")
  End Sub

  Private Sub ui(parameter As String)
    Do
      Me.Text = Now & " " & parameter
    Loop
  End Sub

End Class



А где тут другой поток?
InvokeВыполняет указанный делегат в том потоке, которому принадлежит основной дескриптор окна элемента управления, с указанным списком аргументов.

Нажал на кнопку. Время в шапке тикает, а форма сдохла -ни подвинуть, ни закрыть.
...
Рейтинг: 0 / 0
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
    #38877479
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77А где тут другой поток?
без разницы откуда звать DoIt - из UI потока или любого другого

бесконечный цикл в процедуре ui - так нельзя, ui вызывается из цикла обработки сообщений,
пока не выйдешь из процедуры ui - окно не получит никаких сообщений
...
Рейтинг: 0 / 0
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
    #38877832
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

кажется дошло.

Код: vbnet
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.
Imports System.Threading

Public Class Form1

  Private myThread As Thread
  Private Delegate Sub MyDelegate(parameter As String)

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    myThread = New Thread(New ThreadStart(AddressOf ThreadFunction)) 'здесь запускаем поток
    myThread.Start()
  End Sub

  Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
    myThread.Abort() 'здесь останавливаем/убиваем поток, чтоб предотвратить возможные исключения
  End Sub

  Private Sub ThreadFunction() 'здесь делаем "долбежные дела", может циклиться, может спать, может ждать
    Do
      'Thread.Sleep(100)
      Me.Invoke(New MyDelegate(AddressOf ui), Now().ToString) 'стучимся в ui, передавая параметр(ы)=команда
    Loop
  End Sub

  Private Sub ui(parameter As String) 'здесь обрабатываем команду в потоке формы(полный доступ к ее интерфейсу)
    Me.Text = parameter
  End Sub

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    MsgBox("Not blocked")
  End Sub
End Class



Ну, т.е. для случая mailslot я кручу цикл чтения сообщения в ThreadFunction.
Наверно не тупо Do...Loop а там параметры есть в MailSlot API на бесконечное ожидание нового сообщения.
По получении message я стучу в ui-ф-цию, например передавая это самое msg в нее в качестве parameter as string
Ну а ui уже занимается обработкой, имея доступ ко всем элементам формы.
Так?

Изопропилui вызывается из цикла обработки сообщений ,
пока не выйдешь из процедуры ui - окно не получит никаких сообщений
В принципе тогда я могу получить то же самое и без .Net конструкции Delegate+Invoke
Я могу послать "самому себе" SendMessage (Me.handle, WM_COPYDATA, 0, <parameter as string>) и обработать parameter в основной WndProc. Так ведь?

Почему я стал отказываться от WM_COPYDATA (ее преимущество, что она стучится в окно "как только так сразу") в пользу mailslot:
1) Потому что обработка WM_COPYDATA "блокирует" вызывающую сторону (приложение) на время обработки сообщения на принимающей стороне.
2) Потому что нельзя слать WM_COPYDATA между разными User-аккаунтами (например сервис System не может послать сообщение в User окно и наоборот), у mailslot этого недостатка нет.

А в комбинации
Mailslot+Thread+(Delegate+Invoke)
либо
Mailslot+Thread+(WM_COPYDATA своему окну)
вроде как при преимуществах mailslot решается вопрос с "получил как только так сразу".
Не, ну наверно раз в .Net то лучше уж первое.

Вроде все красиво.
...
Рейтинг: 0 / 0
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
    #38877838
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

используйте Task'и, это удобнее и практичнее
...
Рейтинг: 0 / 0
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
    #38877958
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesиспользуйте Task'и,
Не рассматриваю, оно кажется с .Net 2 не совместимо.

Да Thread думаю нормально.
Счас попробую с MailSlot-Read процедурой потестить.

Вопрос:
myThread.Abort() в Form_Closed достаточно, чтоб поток "под занавес" не "нагадил"?
...
Рейтинг: 0 / 0
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
    #38877962
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77В принципе тогда я могу получить то же самое и без .Net конструкции Delegate+Invoke
Я могу послать "самому себе" SendMessage (Me.handle, WM_COPYDATA, 0, <parameter as string>) и обработать parameter в основной WndProc. Так ведь?

ну не сенд, а post

Зачем тебе .net ? Бери в руки с++

иначе будешь трахать мозг себе и людям бесконечно
...
Рейтинг: 0 / 0
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
    #38877964
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77myThread.Abort()
за такое завершение потока нужно больно бить по рукам.
...
Рейтинг: 0 / 0
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
    #38877983
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилну не сенд, а post
post с WM_COPYDATA не работает, обсуждалось много где неоднократно. Передаваемая структура (обсуждавшийся выше массив байтов) убьется раньше чем принимающая сторона ее прочтет. По этой же причине As Byte() наверняка и не работает.
Я думаю предложенное тобой Delegate+Invoke здесь оптимально, поэтому WM_COPYDATA можно не обсуждать.
Просто не сразу врубился в твой пример в том виде как ты его написал.

ИзопропилДмитрий77myThread.Abort()
за такое завершение потока нужно больно бить по рукам.
Бить не надо, лучше объясни.
Как его завершить в моем примере? Если ничего не сделать, то он продолжит Invok-ать в закрытую форму, что вызовет ошибку при закрытии формы.
А метода типа .Stop() я не вижу.
...
Рейтинг: 0 / 0
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
    #38878002
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

создать флаг, при котором цикл завершится. Наверное так.
...
Рейтинг: 0 / 0
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
    #38878007
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

поток должен ждать какого либо события чтобы завершиться штатно.

на худой конец может в случае отсутствия работы засыпать на какое-то время( например в ожидании завершения асинхронной операции с заданным таймаутом),
пробудившись проверять флаг запроса завершения
...
Рейтинг: 0 / 0
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
    #38878252
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот, подправил логику чтения из Mailslot с учетом обсуждаемого:

Код: vbnet
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.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
Public Class Form1
  Dim MailSlotThread As Thread
  Private Delegate Sub MailSlotDelegate(ByVal NewMessage As String)

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    If MakeMailSlot("\\.\mailslot\MailSlotMyName", True) Then
      MailSlotThread = New Thread(New ThreadStart(AddressOf MailSlotThreadFunction))
      MailSlotThread.Start()
    End If
  End Sub

  Private Sub MailSlotThreadFunction()
    Dim m_Message As String = ""
    Do
      If MailSlotReadFirstInfinite(m_Message) Then _
       Me.Invoke(New MailSlotDelegate(AddressOf MailSlotUIFunction), m_Message)
    Loop
  End Sub

  Private Sub MailSlotUIFunction(ByVal NewMessage As String)
    '---обработка сообщения---
    'MsgBox(NewMessage)
    Me.Text = NewMessage
    '---обработка сообщения---
  End Sub

  Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
    If Not IsNothing(MailSlotThread) Then MailSlotThread.Abort()
    CloseMailSlot() 'необх. нет, т.к. он уничтожится по любому вместе с закрытием приложения
  End Sub
...===========
  Public Function MakeMailSlot(ByVal lpszSlotName As String, _
   Optional ByVal WaitForever As Boolean = False) As Boolean
...
    hMailSlotHandle = CreateMailslot(lpszSlotName, 0, IIf(WaitForever, MAILSLOT_WAIT_FOREVER, 0), m_tSA)

  Public Function MailSlotReadFirstInfinite(ByRef m_Message As String) As Boolean
    'возвращает True,если сообщение прочитано
    'm_Message -возвращает текст первого сообщения при успехе
    'пока не получено, ReadFile ждет за счет MAILSLOT_WAIT_FOREVER при создании MailSlot

    Dim lBufferSize As Integer = 260 ' arbitrary - can be set higher/lower if desired
    Dim sBuffer(lBufferSize - 1) As Byte
    Dim lBytesRead As Integer 'сколько байт прочитали -чтоб обрезать буфер

    ' Read data: optional параметры ф-ции не используем
    If ReadFile(hMailSlotHandle, sBuffer, lBufferSize, lBytesRead, IntPtr.Zero) = False Then
      If Err.LastDllError = ERROR_INSUFFICIENT_BUFFER Then
        GetMailslotInfo(hMailSlotHandle, 0, lBufferSize, 0, 0) 'получаем точный размер буфера, если не хватило
        ReDim sBuffer(lBufferSize - 1)
        'читаем повторно с точным размером буфера
        If ReadFile(hMailSlotHandle, sBuffer, lBufferSize, lBytesRead, IntPtr.Zero) = False Then
          Return False 'хз-не должно такого быть
        End If
      Else
        Return False 'любая другая ошибка, например при обращении к несуществующему MailSlot
      End If
    Else 'в случае успеха с первого раза буфер надо обрезать
      ReDim Preserve sBuffer(lBytesRead - 1)
    End If

    Using mstream As New IO.MemoryStream(sBuffer)
      Using reader As New IO.StreamReader(mstream, System.Text.Encoding.Default, True)
        m_Message = reader.ReadToEnd()
      End Using
    End Using
    Return True
  End Function



Вроде все отлично, стреляет "как только получено".
Но вы пишете.

Изопропилза такое завершение потока нужно больно бить по рукам
...
поток должен ждать какого либо события
Roman Mejtesсоздать флаг, при котором цикл завершится

У меня нет "бесконечно долбящего" цикла, у меня поток висит на функции ReadFile, а висит она за счет MAILSLOT_WAIT_FOREVER при создании MailSlot. И вот куда мне этот "флаг" (для корректного выхода из цикла в MailSlotThreadFunction и завершения потока) втыкать?
Ну если только закрыть MailSlot до закрытия потока и это сгенерирует какую-нибудь спецошибку в ReadFile ,которую я верну через MailSlotReadFirstInfinite и выйду из цикла. Но это надо играться.
...
Рейтинг: 0 / 0
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
    #38878286
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Ну если только закрыть MailSlot до закрытия потока и это сгенерирует какую-нибудь спецошибку в ReadFile ,которую я верну через MailSlotReadFirstInfinite и выйду из цикла. Но это надо играться.

Ну вообще вот так наверно достаточно:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
   CloseMailSlot() 'необх. нет, т.к. он уничтожится по любому вместе с закрытием приложения
  End Sub


  Private Sub MailSlotThreadFunction()
    Dim m_Message As String = ""
    Do
      If MailSlotReadFirstInfinite(m_Message) Then
        Me.Invoke(New MailSlotDelegate(AddressOf MailSlotUIFunction), m_Message)
      Else
        Exit Do
      End If
    Loop
  End Sub



Происходит следующее:
При выполнении CloseHandle(hMailSlotHandle)
ReadFile находящийся в режиме бесконечного ожидания выходит с ошибкой ERROR_HANDLE_EOF (38)
Моя MailSlotReadFirstInfinite возвращает False (номер ошибки думаю можно даже не отслеживать)
По этому False я выхожу из цикла -> поток завершается
Исключения за счет незакрытого потока не возникает.

Вариант?
...
Рейтинг: 0 / 0
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
    #38878431
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77У меня нет "бесконечно долбящего" цикла, у меня поток висит на функции ReadFile, а висит она за счет MAILSLOT_WAIT_FOREVER при создании MailSlot.
а нужно с таймаутом висеть и по прошествии таймаута флаг проверять - далее чтение в цикле
...
Рейтинг: 0 / 0
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
    #38878432
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Вариант?
да
...
Рейтинг: 0 / 0
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
    #38878446
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилДмитрий77У меня нет "бесконечно долбящего" цикла, у меня поток висит на функции ReadFile, а висит она за счет MAILSLOT_WAIT_FOREVER при создании MailSlot.
а нужно с таймаутом висеть и по прошествии таймаута флаг проверять - далее чтение в цикле
Какая разница? С таймаутом или бесконечно. Хотя конечно с учетом выхода по ERROR_HANDLE_EOF разница есть: флаг сразу сработает. Только он не нужен если я отслеживаю error.
ИзопропилДмитрий77Вариант?
да
Ну вот на этом и остановимся. Имплементировал в проект, все отлично работает.
Кстати в проекте без отработки выхода по ошибке форма закрывается, а прога остается висеть (без крашей) - потому что я не в саму форму "стучу", а в public ф-цию модуля.

Так или иначе поток надо закрывать.
...
Рейтинг: 0 / 0
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
    #38878514
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Какая разница? С таймаутом или бесконечно
завершение работы потока закрытием хэндла - частный случай.
...
Рейтинг: 0 / 0
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
    #38878537
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилзавершение работы потока закрытием хэндла - частный случай.
Ну, главное что для этого случая все отлично работает.
Будут другие случаи, буду смотреть.
Но во всех случаях когда в цикле разумно делать тупое засыпание через Sleep(N ms), я предпочту обычный таймер, нежели городить огород с потоком.
В данном случае я выигрываю в пользу "как только так сразу", из-за этого таймер с MailSlot-ом таки напрягал, хотя я и читал Messag-ы блоками, т.е. не по одному раз в секунду а все имеющиеся не позже чем через секунду.

Напрягают обычно 2 вещи:
1) подвисание UI потока (программа занята длительной операцией)
2) тупой должбеж чего-либо в надежде получить что-нибудь чего может долгое время не быть вообще (проверка таймером или какой нибудь цикл пусть бы и с DoEvent()). Да и в отдельном потоке такое делать - не фонтан.
...
Рейтинг: 0 / 0
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
    #38878551
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Да и в отдельном потоке такое делать - не фонтан.
конечно не фонтан - на то и существуют события, асинхронный ввод-вывод, порты завершения, и т д
...
Рейтинг: 0 / 0
Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
    #38878552
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Напрягают обычно 2 вещи:
1) подвисание UI потока (программа занята длительной операцией)
операции запускать асинхронно, при невозможности - в отдельном потоке.
в UI потоке - только рисование


PS что характерно воевать с дотнетом нет никакого желания
...
Рейтинг: 0 / 0
24 сообщений из 49, страница 2 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Mailslot /SendMessage(WM_COPYDATA). Передача строк. Unicode или ANSI или все равно как?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]