Multithreading

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

Multithreading

Сообщение f0rbeed » 15.04.2003 (Вт) 21:01

Народ! Подскажите новичку, как выделить поток для системной функции и при том передать ей несколько параметров. Поток я могу создать... Вот что я пытаюсь сделать:

With Thread1
.Initialize AddressOf SendNet
.Priority = THREAD_PRIORITY_IDLE
.Enabled = True
End With

Module1:
...
Private Declare Function NetMessageBufferSend Lib "netapi32.dll" (ByVal ServerName As String, ByVal MsgName As String, ByVal FromName As String, Buf As Any, BufLen As Long) As Long

Public Sub SendNet()
...
From = StrConv(Name, vbUnicode)
To = StrConv(frmMain.cmbTo.Text, vbUnicode)
Buf = StrConv(frmMain.txtMess, vbUnicode)
Len = LenB(frmMain.txtMess)
x = NetMessageBufferSend(sEmpty, To, From, ByVal Buf, ByVal Len)
End Sub
В результате чего при созданиии потока функция NetMessageBufferSend не вызывается... Help me pleaze
Так быстро, что незаметно...

ASD
Модератор
Модератор
Аватара пользователя
 
Сообщения: 1758
Зарегистрирован: 07.12.2001 (Пт) 21:08
Откуда: Russia

Сообщение ASD » 16.04.2003 (Ср) 10:14

With Thread1
.Initialize AddressOf SendNet
.Priority = THREAD_PRIORITY_IDLE
.Enabled = True
End With


Я только непонял это что?
Ты случаем это не на Net делаешь?
Если да, то ты пишешь не в тот раздел конфы, если нет то выше приведенный код непонятен. Поясни хотябы на чем это написано.
Moderator VBStreets
---------------------------

f0rbeed
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 18.12.2002 (Ср) 17:51
Откуда: Russia

Сообщение f0rbeed » 17.04.2003 (Чт) 12:07

Нет не на .NEt. На ВБ 6. Просто я не запостил класс для создания потока. Нашел его в инете.
Вот он:
Option Explicit
Option Compare Text
Option Base 0

Private Type udtThread
Handle As Long
Enabled As Boolean
End Type

Private uThread As udtThread

Private Const CREATE_SUSPENDED As Long = &H4
Private Const THREAD_BASE_PRIORITY_IDLE As Long = -15
Private Const THREAD_BASE_PRIORITY_LOWRT As Long = 15
Private Const THREAD_BASE_PRIORITY_MAX As Long = 2
Private Const THREAD_BASE_PRIORITY_MIN As Long = -2
Private Const THREAD_PRIORITY_HIGHEST As Long = THREAD_BASE_PRIORITY_MAX
Private Const THREAD_PRIORITY_LOWEST As Long = THREAD_BASE_PRIORITY_MIN
Private Const THREAD_PRIORITY_ABOVE_NORMAL As Long = (THREAD_PRIORITY_HIGHEST - 1)
Private Const THREAD_PRIORITY_BELOW_NORMAL As Long = (THREAD_PRIORITY_LOWEST + 1)
Private Const THREAD_PRIORITY_IDLE As Long = THREAD_BASE_PRIORITY_IDLE
Private Const THREAD_PRIORITY_NORMAL As Long = 0
Private Const THREAD_PRIORITY_TIME_CRITICAL As Long = THREAD_BASE_PRIORITY_LOWRT

Private Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
Private Declare Function ResumeThread Lib "kernel32" (ByVal hThread As Long) As Long
Private Declare Function SetThreadPriority Lib "kernel32" (ByVal hThread As Long, ByVal nPriority As Long) As Long
Private Declare Function GetThreadPriority Lib "kernel32" (ByVal hThread As Long) As Long
Private Declare Function SuspendThread Lib "kernel32" (ByVal hThread As Long) As Long
Private Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long

Public Sub Initialize(ByVal lpfnBasFunc As Long)
Dim lStackSize As Long, lCreationFlags As Long, lpThreadId As Long, lNull As Long
On Error Resume Next

lNull = 0
lStackSize = 0
lCreationFlags = CREATE_SUSPENDED
uThread.Handle = CreateThread(lNull, lStackSize, lpfnBasFunc, lNull, lCreationFlags, lpThreadId)
If uThread.Handle = lNull Then MsgBox "Create thread failed!"
End Sub
Public Property Get Enabled() As Boolean
On Error Resume Next
Enabled = uThread.Enabled
End Property

Public Property Let Enabled(ByVal vNewValue As Boolean)
On Error Resume Next
If vNewValue And (Not uThread.Enabled) Then
ResumeThread uThread.Handle
uThread.Enabled = True
ElseIf uThread.Enabled Then
SuspendThread uThread.Handle
uThread.Enabled = False
End If
End Property

Public Property Get Priority() As Long
On Error Resume Next
Priority = GetThreadPriority(uThread.Handle)
End Property

Public Property Let Priority(ByVal vNewValue As Long)
On Error Resume Next
If vNewValue = -2 Then
Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_LOWEST)
ElseIf vNewValue = -1 Then
Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_BELOW_NORMAL)
ElseIf vNewValue = 0 Then
Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_NORMAL)
ElseIf vNewValue = 1 Then
Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_ABOVE_NORMAL)
ElseIf vNewValue = 2 Then
Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_HIGHEST)
End If
End Property

Private Sub Class_Terminate()
On Error Resume Next
Call TerminateThread(uThread.Handle, 0)
End Sub
Так быстро, что незаметно...

f0rbeed
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 18.12.2002 (Ср) 17:51
Откуда: Russia

Сообщение f0rbeed » 23.04.2003 (Ср) 14:20

Ну так что? Может кто-нибудь поможет? Или прокомментирует?
Так быстро, что незаметно...

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 23.04.2003 (Ср) 17:01

Код: Выделить всё
Private Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long


lpParameter specifies a single 32-bit parameter value passed to the thread.


Передавай в нем указатель на свой параметр. Он как раз и будет передан управляющей функции потока. Для этого тебе надо процедурку Initialize подправить.

PS. Спасибо за пост, я сам это искал :)

f0rbeed
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 18.12.2002 (Ср) 17:51
Откуда: Russia

Сообщение f0rbeed » 01.05.2003 (Чт) 22:43

А можно на этом же примере показать?
Так быстро, что незаметно...

f0rbeed
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 18.12.2002 (Ср) 17:51
Откуда: Russia

Сообщение f0rbeed » 03.05.2003 (Сб) 22:15

Лююююди гдееееее выыы!!!!
Так быстро, что незаметно...

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 03.05.2003 (Сб) 22:41

Это только для VB5 в шестом работать не будет...
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

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

Сообщение GSerg » 04.05.2003 (Вс) 5:18

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

f0rbeed
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 18.12.2002 (Ср) 17:51
Откуда: Russia

Сообщение f0rbeed » 04.05.2003 (Вс) 16:02

Неправда. Этот пример у меня есть, как раз он то и не работает почему то, а то что я показал у меня работает. Странно конечно... Так что там с моей проблемой то? Мне было бы приятно получить ответ... :?
Так быстро, что незаметно...

f0rbeed
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 18.12.2002 (Ср) 17:51
Откуда: Russia

Сообщение f0rbeed » 04.05.2003 (Вс) 16:10

Александр Андреев писал(а):Передавай в нем указатель на свой параметр. Он как раз и будет передан управляющей функции потока. Для этого тебе надо процедурку Initialize подправить.


Можно показать как это сделать? Нам моем же примере, если не трудно.
Так быстро, что незаметно...

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 05.05.2003 (Пн) 10:02

Я попробую... только за быстроту ответа не ручаюсь.

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 05.05.2003 (Пн) 11:30

Слушай, а может так:

Код: Выделить всё
Public param As Integer

Public Function ThreadProc()

    ' Доступ к переменной из управляющей функции потока
    MsgBox param

End Function


через явную передачу параметра что-то пока не получается... Это же не C, а VB. :wink:

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 05.05.2003 (Пн) 13:31

Зато вот какая проблема получается:
Если делать Run в IDE, то все работает нормально. Если же скомпилировать exe-шник, то при попытке вызова управляющей функции потока приложение отваливается с сообщением: "The instruction at <addr1> referenced memory at <addr2>. The memory could not be 'read'".
Тут есть одна деталь: если управляющую функцию сделать пустой, то все проходит.
Может быть кто-нибудь в курсе, в чем тут дело?

f0rbeed
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 18.12.2002 (Ср) 17:51
Откуда: Russia

Сообщение f0rbeed » 05.05.2003 (Пн) 15:11

А ты в P-code компилируешь?
Так быстро, что незаметно...

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 05.05.2003 (Пн) 15:33

Неа...
Пробовал компилять по-всякому, даже без оптимизации. Все равно отваливается.
f0rbeed, в MSDN есть статья, которая тебе нужна:
Ingenious Ways to Implement Multiple Threads in Visual Basic. Там про передачу параметров сказано.
Но при попытке запустить exe-шник, сделаный на основе первого примера из этой статьи, возникла та же самая ошибка. Хотя из-под IDE все работает. Что бы это могло быть?

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 05.05.2003 (Пн) 15:35

Sebas и GSerg! Почему это не должно работать на 6 VB? У меня работает и тот и другой пример... Но только когда запускаешь через IDE (см.выше).

f0rbeed
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 18.12.2002 (Ср) 17:51
Откуда: Russia

Сообщение f0rbeed » 05.05.2003 (Пн) 15:59

А нельзя ли мне как нить эту статейку перебросить? А то в данный момент у меня нет MSDN.
Так быстро, что незаметно...

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 06.05.2003 (Вт) 9:31

ЛЮДИ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

CREATETHREADE & VB6 вместе не работают.

ОБЩЕИЗВЕСТНЫЙ ФАКТ И ТОЧКА!
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

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

Сообщение GSerg » 06.05.2003 (Вт) 10:13

Sebas писал(а):ЛЮДИ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

CREATETHREADE & VB6 вместе не работают.

ОБЩЕИЗВЕСТНЫЙ ФАКТ И ТОЧКА!


Факт, достойный внимания.
Однако почему же работает экзешник, который сделан из проекта, ссылку на который я оставил? И почему этот проект работает в IDE?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ASD
Модератор
Модератор
Аватара пользователя
 
Сообщения: 1758
Зарегистрирован: 07.12.2001 (Пт) 21:08
Откуда: Russia

Сообщение ASD » 06.05.2003 (Вт) 10:35

Многозадачность в VB6 недоступна.
У тебя проект будет вылетать.
Сделать можно но все это глючно. Есть куча статей по этому поводу.
Советуют даже делать это VB5 он менее подвержен этому.
По томуже принцыпу с VB6 траблы при создании сервиса под НТ
МС говорит что архитектура работы у VB6 немного другая. (подробностей непомню). Хотя для сервисов я нашел один компонент который вроде неглючит. С много задачностью все примеры которые я видел, есть предупреждение о том что возможен вылет. (часто так и бывает). Да и тестировать проект можно только после компиляции.
Иначе 100% вылета.
Moderator VBStreets
---------------------------

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 06.05.2003 (Вт) 11:16

А у меня в IDE все работает, а когда делаю компиляцию - вылетает.
Я вот что еще заметил: если в управляющей функции есть вызов бейсиковской функции, например MsgBox, то программа вылетает. Если MsgBox заменить на вызов апишного MessageBox, то все работает!!!
Может стоит перелопатить весь код, предназначенный для запуска в другом потоке, и убрать из него все вызовы бейсиковских функций? Может тогда будет работать?

ASD
Модератор
Модератор
Аватара пользователя
 
Сообщения: 1758
Зарегистрирован: 07.12.2001 (Пт) 21:08
Откуда: Russia

Сообщение ASD » 06.05.2003 (Вт) 11:39

Эээх ты еще нагребешь проблемм....
Тебе на Net надо там все проще в этом плане...
Или попробуй переведи проект под VB5 и там сделай...
Moderator VBStreets
---------------------------

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 06.05.2003 (Вт) 12:29

Ок, попробую перейти на 5.
А точно там будет лучше работать? 8)

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 06.05.2003 (Вт) 14:14

http://vbnet.ru/article/showarticle.asp?id=20
В этой статье как раз написано о том, что бейсиковский MsgBox не является потоково-безопасным, в отличие от MessageBox API. Так что может попробовать перейти на API?

ASD
Модератор
Модератор
Аватара пользователя
 
Сообщения: 1758
Зарегистрирован: 07.12.2001 (Пт) 21:08
Откуда: Russia

Сообщение ASD » 07.05.2003 (Ср) 11:43

Ну на счет точно, немогу ничего утверждать.
Просто гдето видел статейку по поводу всего этого. Вроде говорят там постабильнее. Хотя мое мнение если язык неимеет этого в своем арсенале, и приходится извращатся то какие могут быть гарантии...
Moderator VBStreets
---------------------------

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

Сообщение GSerg » 07.05.2003 (Ср) 11:48

Статейку почитал, экзешник активно поюзал, IDE тоже. Должен признать полную правоту ASD по поводу нестабильности и отстойности.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 07.05.2003 (Ср) 11:57

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

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

Сообщение GSerg » 07.05.2003 (Ср) 12:05

Форум для того и нужен. Сливай. :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 07.05.2003 (Ср) 12:14

Гы... дайте пару дней довести все до конца :)
Заодно родилась еще одна идея: написать на С++ DLL, которая бы создавала поток и с ним работала, а уже потом из VB ее вызывать. Это же по идее должно сработать...

След.

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

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

Сейчас этот форум просматривают: AhrefsBot, SemrushBot и гости: 38

    TopList  
cron