Страница: 1 | 2 | 3 | 4 | 5 |
|
Вопрос: Два ядра под VB6
|
Добавлено: 08.08.11 21:43
|
|
Автор вопроса: Сергей Юдин
|
Я хочу купить двухядерный компьютер с процессором Intel Core I5 с частотой 3 ГГц вместо моего одноядерного компьютера с частотой 2 ГГц в надежде на то, что это позволит примерно на порядок увеличить производительность компьютера, т.к. сейчас мой компьютер решает мою задачу в программе Solsys7 целую неделю, а мне надо ее решать десятки раз (в лучшем случае) или сотни раз (в худшем случае). Конечно же, основной упор я делаю на наличие двух ядер, хотя и повышенная частота шины и памяти 1333 Мгц и повышенная оперативная память 2*4ГГб и наличие повышенной памяти кэша (даже трех уровней), тоже значительно повысят производительность компьютера.
Так вот вопрос состоит в том – можно ли в программе написанной на Visual Basic 6 запустить два потока (две нити) используя функцию API CreateThread для второго ядра. Исходя из документации Visual Basic 6 это возможно, но все мои попытки и отзывы других пользователей убеждают меня в том, что это только теоретическая возможность, а реально работает только один поток. Насколько я понимаю, это связано с тем, что виртуальная машина, т.е. библиотека msvbvm60.dll может работать только с одним потоком, хотя есть возможность установить семафор обращения к ней с помощью функции API CreateSemaphore, но это опять таки только в теории. По этому, я уточняя свой вопрос – можно ли реально в программе написанной на Visual Basic 6 запустить два потока (второй для другого процессора), если второй поток не обращается к библиотеке msvbvm60.dll, например, обращается к приложению Excell или к библиотеке DLL, написанной на другом языке, например, Free Basic. Можно, конечно же, без особых проблем применить технологию OpenMP, но ее поддерживает только VB.NET, а мне бы не хотелось 21 форму программы Solsys7 переделывать под NET (да и не нравится мне этот NET, т.к. в версии NET это уже не Visual Basic 6, а такой же язык, как и все остальные C++, Pascal и т.д.).
С наилучшими пожеланиями Сергей Юдин.
Ответить
|
Номер ответа: 2 Автор ответа: Ким Чен Ир
Вопросов: 0 Ответов: 140
|
Профиль | | #2
|
Добавлено: 08.08.11 23:36
|
Изврат с отладкой из-под IDE. Ну и дисциплина нужна.
библиотека msvbvm60.dll может работать только с одним потоком
Ничего подобного.
Пишем файл mytlb.idl с примерным содержимым:
-
- [dllname("ole32.dll")]
- module ole32
- {
- [entry("OleInitialize")] long OleInitialize(long pvReserved);
- };
-
- [dllname("kernel32.dll")]
- module kernel32
- {
- [entry("CreateThread")] long CreateThread(long* lpsa, long dwSSz, long lpStAds, long lpParam, long Flags, long* lpThreadId);
- [entry("Sleep")] void Sleep( long dwMilliseconds );
- };
Через командную строку студии делаем из него tlb:
midl /mktyplib203 /tlb D:\mytlb.tlb D:\mytlb.idl
Подключаем в рефренсах к проекту vb6.
Ну и собственно функция потока:
- Public Function thread_func(ByVal param As Long) As Long
- OleInitialize 0
- Dim i As Long
- For i = 0 To 100000
- Form1.Label1.Caption = i
- Sleep 100
- Next
- End Function
все api - задекларировать только в tlb
С отладкой мои соболезнования.
Ответить
|
Номер ответа: 5 Автор ответа: Ким Чен Ир
Вопросов: 0 Ответов: 140
|
Профиль | | #5
|
Добавлено: 09.08.11 20:19
|
Исходник скину, только почищу, а то там черт ногу сломит. Сам уже с трудом ориентируюсь.
Касательно сабжа: SetThreadAffinityMask
Ответить
|
Номер ответа: 9 Автор ответа: Ким Чен Ир
Вопросов: 0 Ответов: 140
|
Профиль | | #9
|
Добавлено: 11.08.11 04:54
|
SetProcessAffinityMask(ByVal GetCurrentProcessId(), ByVal 1)
не работает, по идее должен быть выбран только второй проц, но маска не назначается
идентификатор процесса и его хендл в корне разные вещи.
Ответить
|
Номер ответа: 10 Автор ответа: Ким Чен Ир
Вопросов: 0 Ответов: 140
|
Профиль | | #10
|
Добавлено: 11.08.11 05:01
|
P/s Smith. Проектик тебе отправил. Все не так сложно, как ты думаешь.
В новом потоке инициализируется ole и tls. И ограничить доступ к совместно используемым объектам.
Вообщем, разберешься.
Ответить
|
Номер ответа: 12 Автор ответа: Ким Чен Ир
Вопросов: 0 Ответов: 140
|
Профиль | | #12
|
Добавлено: 11.08.11 19:25
|
http://dump.ru/file/5344058
Ответить
|
Номер ответа: 14 Автор ответа: Smith
ICQ: adamis@list.ru
Вопросов: 153 Ответов: 3632
|
Профиль | | #14
|
Добавлено: 12.08.11 01:47
|
Пример посмотрел, изврат изящный
Выглядит готовым к употреблению, пока не переписал под своё не скажу, что заработало.
Передавать мелочевку безопасно из потока в поток можно и апишками, а крупняк можно временными файлами.
пошел выбор процессора
На форме пара листбоксов и пара кнопок
- Option Explicit
-
- Private Declare Function GetProcessAffinityMask Lib "kernel32" (ByVal hProcess As Long, ByRef ProcessMask As Long, ByRef SystemMask As Long) As Long
- Private Declare Function SetProcessAffinityMask Lib "kernel32" (ByVal hProcess As Long, ByVal lMask As Long) As Long
- Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
-
- Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
- Private Const PROCESS_ALL_ACCESS = &HF0000 Or &H100000 Or &HFFF
-
- Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
- Private hCurrentProcess As Long
-
-
- Private Function Mask() As Long
- Dim Item As Long
-
- For Item = 0 To List1.ListCount - 1
- Mask = Mask + CLng(List2.Selected(Item)) * (2 ^ Item)
- Next
- If Mask = 0 Then List2.Selected(0) = True: Mask = 1 Else Mask = Abs(Mask)
- Caption = Mask
-
- End Function
-
- Private Function ExtractBit(ByVal Dec As Byte, ByVal MyBit As Integer) As Boolean
- ExtractBit = Dec And (2 ^ (MyBit - 1))
- End Function
-
-
- Private Function SetProcessMask(ByRef hProcess As Long, ByRef lMask As Long) As Boolean
- Timer1.Enabled = False
- SetProcessMask = SetProcessAffinityMask(hProcess, lMask) > 0
- Sleep (0)
- If SetProcessMask = True Then Caption = "Успешно!" Else Caption = "Ошибка!"
- Timer1.Enabled = True
- End Function
-
-
- Private Sub Command1_Click()
- SetProcessMask hCurrentProcess, Mask
- End Sub
-
- Private Sub Command2_Click()
- Dim Tmp As Long
-
- Tmp = CLng(Shell(App.Path & "\" & App.EXEName & ".exe", vbNormalFocus))
- SetProcessMask OpenProcess(PROCESS_ALL_ACCESS, False, Tmp), Mask
- End Sub
-
- Private Sub Form_Load()
- For hCurrentProcess = 1 To CLng(Environ$("NUMBER_OF_PROCESSORS"))
- List1.AddItem "Процессор #" & hCurrentProcess
- List2.AddItem "Процессор #" & hCurrentProcess
- List2.Selected(hCurrentProcess - 1) = True
- Next
- hCurrentProcess = GetCurrentProcess
- End Sub
-
- Private Sub Timer1_Timer()
- Dim ProcAffinityMask As Long, SysAffinityMask As Long
- Dim Item As Long, Tmp As Byte
-
- GetProcessAffinityMask hCurrentProcess, ProcAffinityMask, SysAffinityMask
-
- For Item = 1 To List1.ListCount
- List1.Selected(Item - 1) = ExtractBit(CByte(ProcAffinityMask), Item)
- Next
- Caption = vbNullString
- End Sub
Ответить
|
Страница: 1 | 2 | 3 | 4 | 5 |
Поиск по форуму