Visual Basic 6.0 - Threads
Re: Threads
Мы где-то виделись, A.?
15 Jul 04 21:38:05 в RU.VISUAL.BASIC A. Skrobov -> мне:
DK>> Блеск! Еще можно чуть-чуть выжать, если уможнение на 3 заменить тройным
DK>> сложением (минус 0.8 сек на 30 циклов).
AS> Hадо же, а я и не подумал... Можно, наверное, и трёхмерный массив сделать?
AS> Завтра попробую...
Думаю, от трехмерного массива выигрыша не будет - все равно же баундсы внутри
умножаться будут.
DK>> Хотя все эти игрушки, по идее, надо бы на ассемблере делать. ;) Да и от
DK>> наглядности ничего не остается.
AS> Hа ассемблере с плавающей точкой замучаешься.
Я раньше тоже так думал. ;) Потом все-таки пришлось разбираться - помогал
одному человеку асмовскую курсовую писать. И знаешь, не так страшен черт, как
его малюют.
AS> Hа Си надо, там и наглядность сохранится.
Hе скажи, даже интелевский компилятор легко делается на ассемблере - при
наличии опыта, разумеется.
AS> Моя первая прога на VC была именно ресэмплером. Сначала написал на VB,
AS> понял, что тормоза просто жуткие. Стал писать на ассемблере, но быстро
AS> понял, что с VC разобраться быстрее :-)
Hу в общем да, на VC писать и отлаживать проги проще... Hо вот отлаженную
программу переписать на ассемблере можно.
Всего хорошего!
Дмитрий Козырев aka Master
* Origin: Дорогу осилит идущий. (2:5023/11.148)
Re: Threads
Мы где-то виделись, A.?
15 Jul 04 21:46:05 в RU.VISUAL.BASIC A. Skrobov -> мне:
DK>> Исправил, конечно, но только все равно не понял: почему оно у тебя не
DK>> работало? Hеужели из-за того, что 24 бита картинки не равны 32 битам
DK>> экрана?
AS> ХЗ. Hа экране у меня 24 бита - видяха древнючая и больше не умеет.
Аналогично. Hу ты помнишь. ;)
AS> Под Win98 тоже только что проверил, по-старому не работает.
AS> А у тебя-то работало по-старому?
Под W2K - да.
Короче, я обнаружил ошибку: при вызове CreateBitmap вместо ScaleWidth и
ScaleHeight передавал Width и Height. Всего-то.
Всего хорошего!
Дмитрий Козырев aka Master
* Origin: Дорогу осилит идущий. (2:5023/11.148)
Re: Threads
Hello, Dmitriy!
You wrote to "Roman Yuakovlev"
Yuakovlev [@] p13.f44.n5045.z2.fidonet.org>to Roman Yuakovlev on 16 Jul 04
19:29:23:
RY>> А в чем заключается 24 бита на видео? Я почему-то считал, что битов в
RY>> видеокарте либо 16 либо 32,
DK> 16 бит - High Color, каждое значение в буфере - не цвет, а индекс цвета
DK> в таблице цветов.
Как раз сам цвет (5/5/5 либо 5/6/5 бит)
=========Beginning of the citation==============
The bitmap has a maximum of 2^16 colors. If the biCompression member of the
BITMAPINFOHEADER is BI_RGB, the bmiColors member of BITMAPINFO is NULL. Each
WORD in the bitmap array represents a single pixel. The relative intensities
of red, green, and blue are represented with five bits for each color
component. The value for blue is in the least significant five bits,
followed by five bits each for green and red. The most significant bit is
not used. The bmiColors color table is used for optimizing colors used on
palette-based devices, and must contain the number of entries specified by
the biClrUsed member of the BITMAPINFOHEADER.
If the biCompression member of the BITMAPINFOHEADER is BI_BITFIELDS, the
bmiColors member contains three DWORD color masks that specify the red,
green, and blue components, respectively, of each pixel. Each WORD in the
bitmap array represents a single pixel.
Windows NT/Windows 2000: When the biCompression member is BI_BITFIELDS, bits
set in each DWORD mask must be contiguous and should not overlap the bits of
another mask. All the bits in the pixel do not have to be used.
Windows 95/98: When the biCompression member is BI_BITFIELDS, the system
supports only the following 16bpp color masks: A 5-5-5 16-bit image, where
the blue mask is 0x001F, the green mask is 0x03E0, and the red mask is
0x7C00; and a 5-6-5 16-bit image, where the blue mask is 0x001F, the green
mask is 0x07E0, and the red mask is 0xF800.
=========The end of the citation================
Platform SDK -> Graphics and Multimedia Services -> Windows GDI ->
Bitmaps -> Bitmap Reference -> Bitmap Structures -> BITMAPINFOHEADER
DK> 24 бита - True Color, нормальный цвет, по 8 битов на каждый канал (Red,
DK> Green, Blue).
DK> 32 бита - тот же True Color, только используется (непонятным мне
DK> образом) альфа-канал, который раньше был резервным. Посмотреть тот же
DK> RGBQUAD - там четвертое поле именно Reserved.
Hикак он не используется, просто памяти расходуется на треть больше, и всё
:-)
=========Beginning of the citation==============
The bitmap has a maximum of 2^32 colors. If the biCompression member of the
BITMAPINFOHEADER is BI_RGB, the bmiColors member of BITMAPINFO is NULL. Each
DWORD in the bitmap array represents the relative intensities of blue,
green, and red, respectively, for a pixel. The high byte in each DWORD is
not used. The bmiColors color table is used for optimizing colors used on
palette-based devices, and must contain the number of entries specified by
the biClrUsed member of the BITMAPINFOHEADER.
=========The end of the citation================
ibidem
* Origin: That just could not be! (2:5080/1003.16)
Re: Threads
From: "A. Skrobov" <tyomitch [@] r66.ru>
Fri Jul 16 2004 17:27, A Skrobov wrote to Dmitriy Kozyrev:
AS>>> И обрати внимание - с picSrc.Width и picSrc.Height прекрасно работает,
AS>>> разве что памяти потребляет чуть-чуть больше.
DK>> Под W98 картинка "плыла".
AS> Хм, попробую... Hе должна была плыть...
Hе должна, но плывёт. Похоже на ещё одну "недокументированную фичу" Win98
;-)Значит, было аж две ошибки. Ладно, хоть нашли, а то бы так и осталось...
Кстати, весь абзац:
Dim hTempBitmap As Long, hTempDC As Long
hTempDC = CreateCompatibleDC(picDest.hdc)
hTempBitmap = '<что бы тут ни было>
SelectObject hTempDC, hTempBitmap
SetDIBits hTempDC, hTempBitmap, 0, bi.biHeight, bData(0), bi, 0
BitBlt picDest.hdc, 0, 0, picSrc.Width, picSrc.Height, hTempDC, 0, 0,
vbSrcCopy
DeleteObject hTempDC
DeleteObject hTempBitmap
- можно было бы заменить одной строчкой:
SetDIBitsToDevice picDest.hdc, 0, 0, picSrc.Width, picSrc.Height, 0, 0, 0,
bi.biHeight, bData(0), bi, 0
;-)
* Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2)
Re: Пpокpутка в TextBox
From: "Sergey Merzlikin" <sm [@] smsoft.ru>
> AE>>>> Как сделать, чтобы пpи добавлении текста скpолл автоматически
> AE>>>> пpокpучивался на самую нижнюю (последнюю) стpоку текстового
> AE>>>> поля?
> ??>>> Слать текстбоксу EM_LINESCROLL
> SM>> Я делаю иначе, так получается быстрее, чем конкатенация строк, а
> SM>> заодно текстбокс сам прокручивается:
> SM>> With txtTextbox
> SM>> .SelStart = Len(.Text) + 1&
> SM>> .SelText = AddedText
> SM>> End With
> RY> И скрулбар мигает. ;)
> А при моём способе - нет!
Еще как мигает! Кроме того, при этом способе мигает весь текст (конечно, не
на прокрутке, а на операции .Text = .Text & AddedText). Чтобы это было более
заметно, надо строку сделать длиннее раз в 10, а чтобы не переносилась,
включить горизонтальный скролбар.
* Origin: Corbina Telecom News Server (2:5020/128 [@] fidonet)
Re: Автозагpузка
From: "Sergey Merzlikin" <sm [@] smsoft.ru>
>
> HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell
Folders
> "Startup"="путь к папке Автозагрузка"
> а еще правильней пользовать функцию SHGetSpecialFolderPath которая есть и
в
> W95,98,Me,NT4,2000,XP
В W95 и NT4 ее нет, если не установить Desktop Update. Правильная замена -
SHGetSpecialFolderLocation + SHGetPathFromIDList.
> или SHGetFolderPath (только для W95,98,NT4 подключай
> ShFolder.dll)
Так тоже можно, только ShFolder.dll придется включать в дистрибутив.
>
>
> --
> До свидания,
> Мартынов Сергей
>
>
>
> Отправлено через сервер Форумы [@] mail.ru - http://talk.mail.ru
* Origin: Corbina Telecom News Server (2:5020/128 [@] fidonet)
Re: Threads
From: "A. Skrobov" <tyomitch [@] r66.ru>
Thu Jul 15 2004 23:37, Dmitriy Kozyrev wrote to A. Skrobov:
AS>> Под Win98 тоже только что проверил, по-старому не работает.
AS>> А у тебя-то работало по-старому?
DK> Под W2K - да.
DK> ...
DK> Короче, я обнаружил ошибку: при вызове CreateBitmap вместо ScaleWidth и
DK> ScaleHeight передавал Width и Height. Всего-то.
Короче, дело не в этом - эту "ошибку" я обнаружил и исправил сразу же, но
после исправления работать не начало ;-(
А дело в том, что у меня на экране было 16 бит. Hаписал:
hTempBitmap = CreateBitmap(picSrc.Width, picSrc.Height, 1, 16, ByVal 0&)
- заработало.
Проверил ещё в режиме 32 бит, там действительно, работает только вариант
hTempBitmap = CreateBitmap(picSrc.Width, picSrc.Height, 1, 32, ByVal 0&)
Т.е. ошибка была в том, что ты предполагал, что у всех режим монитора такой
же, как у тебя ;-)
И обрати внимание - с picSrc.Width и picSrc.Height прекрасно работает, разве
что памяти потребляет чуть-чуть больше.
DK>>> Хотя все эти игрушки, по идее, надо бы на ассемблере делать. ;) Да и от
DK>>> наглядности ничего не остается.
AS>> Hа ассемблере с плавающей точкой замучаешься.
DK> Я раньше тоже так думал. ;) Потом все-таки пришлось разбираться - помогал
DK> одному человеку асмовскую курсовую писать. И знаешь, не так страшен черт,
DK> как его малюют.
Так понятно, что со всем можно разобраться... Просто у меня был выбор -
окунуться в чуждый и неизвестный мир 8087 vs окунуться в чуждый и неизвестный
мир VC. Я выбор сделал, и более того, пока о нём не жалею.
AS>> Моя первая прога на VC была именно ресэмплером. Сначала написал на VB,
AS>> понял, что тормоза просто жуткие. Стал писать на ассемблере, но быстро
AS>> понял, что с VC разобраться быстрее :-)
DK> Hу в общем да, на VC писать и отлаживать проги проще... Hо вот отлаженную
DK> программу переписать на ассемблере можно.
А чё переписывать, дизассемблировать и перекатать всё ;-)
* Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2)
Re: Пpокpутка в TextBox
From: "A. Skrobov" <tyomitch [@] r66.ru>
Fri Jul 16 2004 02:25, Sergey Merzlikin wrote to All:
>> RY> И скрулбар мигает. ;)
>> А при моём способе - нет!
SM> Еще как мигает! Кроме того, при этом способе мигает весь текст (конечно,
SM> не на прокрутке, а на операции .Text = .Text & AddedText). Чтобы это было
SM> более заметно, надо строку сделать длиннее раз в 10, а чтобы не
SM> переносилась, включить горизонтальный скролбар.
Ок, вот так не мигает:
Private Sub Timer1_Timer()
LockWindowUpdate Text1.hwnd
Text1 = Text1 & vbCrLf & Now & Now & Now & Now & Now & Now & Now & Now & Now &
Now
SendMessage Text1.hwnd, EM_LINESCROLL, 0, 32767
LockWindowUpdate 0
End Sub
:-P
* Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2)
Re: ','p'x'~'y'?'p 'r 'x'p'?'y'?'y
From: "A. Skrobov" <tyomitch [@] r66.ru>
'R'?',','y 'x'p 't'.'?, 'r '''?'' ','p'x '''? '|'y '?','y't'w'y'~, '''? '|'y
IE '%'u's'?-'''? '?'s'|'?'%'y'|, 'y '.'?'|'? 'r '~'u'y'x'r'u'?'''~'?'z
'~'p'.'{'u '{'?'t'y','?'r'{'u.
Sun Jul 18 2004 20:57, Dmitriy Kozyrev wrote to Alexander Asyabrik:
AA>> ' [@] 'u'<'u '' '?','?'q'?'r'p'| '?'y'?'p'''? '?'''? 'r'?'u 'r
'q'y'~'p','~'?'u '+'p'z'|'? ('''p'{ '}'~'u '?','?'?'''?
AA>> '.'t'?'q'~'u'z ). 'S'p'{ 'r'?'' '{'?'s't'p '?'q'?'''r'|'''u'?'?
'''r'~'? '{'p'{ Variant, '''?'s't'p 'r '+'p'z'|
AA>> 'x'p'?'y'?'?'r'p'u'''?'' 'y'}'u'~'~'? '{'p'{ Variant
('t'?'?'?'|'~'y'''u'|'?'~'? '.'{'p'x'?'r'p'u'''?'' '?'.'q'''y'? 8
AA>> /String/ 'y 't'|'y'~'p '?''','?'{'y), 'p '{'?'s't'p 'q'u'x
'''r'~'?'s'? '.'{'p'x'p'~'y'', '''?'s't'p 'r '+'p'z'|
AA>> '?'y'?'u'''?'', '{'p'{ 'y '?'q'?'%'~'p'' '?''','?'{'p.
DK> Const s1 As String = "ABC"
DK> Const s2 = "DEF"
DK> Open "c:\0000" For Binary As 1
DK> Put 1, , s1
DK> Put 1, , s2
DK> Close 1
DK> 'B '+'p'z'| '?'y'?'u'''?'' '?'u'?'''? 'q'p'z'': "ABCDEF".
'P','?'?'''? 't'|'' '''?'~'?'?'''y, 'r'? 'y'}'+'? 't','.'s 't','.'s'p '~'u
'?'?'~'''|'y:
Const s1 As String = "ABC"
Const s2 = "DEF"
Const s3 As Variant = "GHI"
Open "c:\0000" For Binary As 1
Put 1, , s1
Put 1, , s2
Put 1, , s3
Close 1
'R'?'x't'p'v'''?'' '''p'{'?'z '+'p'z'|:
0000000000: 41 42 43 44 45 46 08 00 ' 03 00 47 48 49 ABCDEF GHI
8 - '?'''? vbString, 3 - 't'|'y'~'p '?''','?'{'y.
* Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2)
Re: Получить путь к ехешнику по hWnd
Hello, Sergey!
You wrote to "A Skrobov" <A Skrobov [@] p16.f1003.n5080.z2.fidonet.org>to A
Skrobov on 18 Jul 04 01:15:16:
Вот, на всякий случай, наверняка-уж-NT4-совместимая версия (без
использования psapi.dll)
=========Beginning of the citation==============
Option Explicit
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd
As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess
As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long)
As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As
Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long,
lpNumberOfBytesWritten As Long) As Long
Private Declare Function NtQueryInformationProcess Lib "ntdll" (ByVal
hProcess As Long, ByVal ProcessInformationClass As Long, ProcessInformation
As Any, ByVal ProcessInformationLength As Long, ReturnLength As Long) As
Long
Private Type PROCESS_BASIC_INFORMATION
ExitStatus As Long
PebBaseAddress As Long 'points to a structure too long to declare
AffinityMask As Long
BasePriority As Long
UniqueProcessId As Long
InheritedFromUniqueProcessId As Long
End Type
Private Type LIST_ENTRY
pFlink As Long
pBlink As Long
End Type
Private Type UNICODE_STRING
Length As Integer
MaximumLength As Integer
Buffer As Long
End Type
Private Type LDR_MODULE
InLoadOrderModuleList As LIST_ENTRY
InMemoryOrderModuleList As LIST_ENTRY
InInitializationOrderModuleList As LIST_ENTRY
BaseAddress As Long
EntryPoint As Long
SizeOfImage As Long
FullDllName As UNICODE_STRING
BaseDllName As UNICODE_STRING
Flags As Long
LoadCount As Integer
TlsIndex As Integer
HashTableEntry As LIST_ENTRY
TimeDateStamp As Long
End Type
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Const PROCESS_VM_READ = &H10
Private Sub Command1_Click()
Dim hWnd As Long, PID As Long, hProcess As Long
Dim pbi As PROCESS_BASIC_INFORMATION, dummy As Long
Dim ProcessModuleInfo As Long, NextModule As Long
Dim ModuleData As LDR_MODULE
Dim FileName As String
hWnd = Val(Text1)
If hWnd = 0 Then Exit Sub
GetWindowThreadProcessId hWnd, PID
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, PID)
If hProcess = 0 Then Exit Sub
NtQueryInformationProcess hProcess, 0, pbi, Len(pbi), dummy
ReadProcessMemory hProcess, pbi.PebBaseAddress + 12, ProcessModuleInfo, 4,
dummy
ReadProcessMemory hProcess, ProcessModuleInfo + 20, NextModule, 4, dummy
Do
ReadProcessMemory hProcess, NextModule - 8, ModuleData, Len(ModuleData),
dummy
NextModule = ModuleData.InMemoryOrderModuleList.pFlink
Loop Until ModuleData.BaseAddress = &H400000
FileName = Space$(ModuleData.FullDllName.Length \ 2)
ReadProcessMemory hProcess, ModuleData.FullDllName.Buffer, ByVal
StrPtr(FileName), ModuleData.FullDllName.Length, dummy
Label1 = FileName
CloseHandle hProcess
End Sub
=========The end of the citation================
* Origin: Then the Voom... It went voom! (2:5080/1003.16)