| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > CreateThread |
| Автор: Romikgy 20.7.2005, 14:57 |
| Возник такой вопросец к гуру местмым Создаю поток по методу сабжа, все работает Вот и вопрос как правильно работать с формой, с переменными модуля и т.п. из потока???? PS плюс если еще кто-то пояснит как работать с формой из потока созданного с помощью CreateRemoteThread вообще ОГРОМНЕЙШИЙ сенкс |
| Автор: z-END 20.7.2005, 15:10 |
| при работе c формой из потока, необходимо использовать Synchronize при использовании нескольких потоков необходимо использовать CriticalSection |
| Автор: Romikgy 20.7.2005, 15:53 | ||||
Насколько мне известно этот метод для дельфийского класса TThread, а я полmpe.cm API
А это посмотрю спасибо |
| Автор: Петрович 20.7.2005, 22:03 | ||
Ну, если сам на API, то и обеспечивай сам взаимоисключающий доступ к VCL. Дело в том что VCL не реентерабельна. |
| Автор: Romikgy 21.7.2005, 08:13 | ||
В смысле? |
| Автор: poor_yorik 26.7.2005, 10:10 |
| Нельзя использовать большинство компонентов VCL в потоках. Для этого ты должен унаследовать унаследовать класс от TTheard, написать какую-отдельную процедуру run с обращением к форме. Потом в методе Execute, ты пишешь процедуру потока где и используешь Synhronize(Run). |
| Автор: maxim1000 26.7.2005, 10:47 |
| еще вариант - обеспечивать связь с формой не операциями с VCL компонентами, а посылкой сообщений, если, конечно, ситуация позволяет... |
| Автор: Romikgy 26.7.2005, 13:28 | ||
С классом ТТрид это понятно , но мне немного для другого, для работы с чужими компанентами на чужих формах
Можно конечно , если в своем приложении , однак см. выше |
| Автор: Петрович 26.7.2005, 14:11 | ||
Т.е. имеется ввиду компонентами и формами принадлежащими другому процессу? Добавлено @ 14:13 И еще, почитай темку http://forum.vingrad.ru/index.php?showtopic=59219. Там есть для тебя кое что интересное |
| Автор: Romikgy 26.7.2005, 14:25 | ||
Ага |
| Автор: Romikgy 26.7.2005, 14:35 | ||
Ага поучительно Только возникает вопрос чем лучше beginthread , чем createthread? |
| Автор: Петрович 26.7.2005, 14:55 | ||||
В beginthread предусмотрены некоторые действия связанные с обработкой Exception возникающего в процедуре реализующей поток, и еще кое чего. В общем, читай хелп по beginthread
Странно, предполагаю что у тебя проблемы в чем-то другом. А вообще, как ты работаешь "с чужими компанентами на чужих формах"? Приведи-ка пример. |
| Автор: Romikgy 27.7.2005, 12:25 | ||
С Checklistbox я уже разобрался
Это тестовый вариант но он работает |
| Автор: Петрович 28.7.2005, 12:21 | ||||
Вот это как раз странно. 1. Использование переменной p участвующей в выражении границ цикла в теле цикла это не есть хорошо. 2. Не вижу как определены переменные pc и buf, но у меня большие сомнения что ты правильно используешь сообщение LB_GETTEXT. 3. Ну а вот это:
мне вообще кажется чрезмерно смелым способом работы! Особенно, все что касается (p+8). Если у тебя и все остальное написанно в таком же стиле, то тогда вполне понятно почему это не работает как надо. Добавлено @ 12:21 Прости если показался слишком резким. Добавлено @ 12:23 Да, и еще. Можешь посмотреть как правильно работать с LB_GETTEXT в реализации метода TListBoxStrings.Get. |
| Автор: Romikgy 28.7.2005, 14:24 | ||||||||||||
Дафай поочереди :
Это не столь важно букву можно и поменять (т.е. переменную)
pc: array [byte] of char; Buf: byte;
Мож и смело, но это вышло после дизассемблирования участка кода с обычным обращением к компоненте.
Ниче как нибудь сочтемся
И в чем разница???
Вот исходник, в чем у меня отличие??? То что проверок нет??? ну дык это при написании так сказать релиза учтется |
| Автор: Петрович 28.7.2005, 15:56 | ||||||||||||||
Дафай.
Конечно не столь важно, если не столь важен результат
Ну тогда, в ListBox1.Items.Add('Stroka ' + inttostr(j)+' = '+inttostr(dword(buf))); последний inttostr "хапнет" лишних три байта. Хороше если они там будут, а то и AV схлопотать не долго. А в ListBox1.Items.Add('Stroka ' + inttostr(j)+' = '+inttohex(pbyte(p+8)^,1)+' '+strpas(pc));, как ты думаешь, куда ссылается pbyte(p+8)? Какому процессу принадлежит память на которую ты таким образом получаешь указатель? И что будет когда произойет обращение к pbyte(p+8)^?
Ну тогда, это применимо только к тому приложению, которое участок кода которого был дизассемблирован. Причем, только той же самой его версии. Поскольку от версии к версии данное смещение может легко измениться.
А вот кстати и пример Какая версия Delphi у тебя? Могу тебя поздравить Вот текст TListBoxStrings.Get из Delphi 6:
Вот именно так и должно быть, поскольку размер строки, которая будет возвращена SendMessage(..., LB_GETTEXT,...), заранее неизвестен, а соответственно, заранее и неизвестен размер необходимого буфера. Кстати, а у тебя может сломаться уже на строках длинной более 254 символа (pc: array [byte] of char).
Ну... Трудно предположить что при выпуске релиза программист будет скорпулезно проходиться по всему тексту и расставлять обработку ошибок. По крайней мере я такого не видел. Лично я, сразу-же прописываю обработку ошибок. Особенно, учитывая то, что это часто влияет на построение текста программы. Да и при отладке, частенько можно получить ошибку там где ее не получаешь в уже отлаженной программе. В этом случае гораздо приятнее узнать о ней сразу, а не выискивать "почему программа ведет себя не правильно?". |
| Автор: Romikgy 29.7.2005, 08:22 | ||||||||||||||
Аналогично
К словам дафай не будем цеплятся , а !?
dword(buf) - это не захват 4 байт, это преобразование захваченного байта в переменную типа дворд , так что ничего я хватать лишнего не буду !!!
Здеся признаю , лажанулся
Да у меня стоит третья дельфя, есть разница сначала берется длинна текста а вот это что:
И последнее
Я на 100 процентов уверен , что длинны у меня не будут превышать даже 50 символов, так что все окей |
| Автор: Петрович 29.7.2005, 11:02 | ||||||||
Дык не к словам. У тебя так в программе написано.
Согласен. Я что-то стормозил, здесь же не указатель преобразовывается, а непосредственно переменная.
Просто существуют ListBox'ы для которых текст вообще не хранится. Он прорисовывается программой по событию.
Хозяин барин. Я лично в своей жизни никогда ни в чем на все 100% не уверен Ну и в конце концов, так я понял у тебя теперь все нормально работает? |
| Автор: Romikgy 29.7.2005, 14:39 | ||||||||
Дык это только переменная
Оригинально , не встречал .
Угу
На н-ное кол-во процентов, с Checklistbox я разобрался, с TreeView разбираюсь (никак не пойму как программно к детю обратится/выделить , апи или мессагой?) с DBGrid вооще мрак, здеся подсказали ридонли параметр подравить и можно в принципе , через энтер или двойной щелчек мыши , к данным добратся , но как подправить? еслиб тоже через апи или мессаги, былоб гуд |
| Автор: Петрович 29.7.2005, 17:25 | ||
Не, ну если тебя интересует конкретное приложение, с конкретными компонентами. И если тебе известна версия Delphi которой оно было создано, то можно сделать наверное проще. |
| Автор: Girder 30.7.2005, 16:43 | ||
|
| Автор: Romikgy 1.8.2005, 08:04 | ||
Конкретное приложение мне известно, а вот версия дельфи ... |
| Автор: alexkras 10.11.2009, 15:48 | ||
| Обнаружил одну особенность. После вызова CreateThread в теле функции-задачи пытаюсь оператором cin ввести целое число(scanf тоже не помогает), но у меня первая цифра "пропадает", т.е. если я ввожу 430, то в переменную записывается 30, 12 - 2, 1999 - 999 и т.д. С чем это связано? Я решил эту проблему, передавая в качестве четвертого параметра CreateThread это самое число(приведенное к типу LPVOID, естественно), которое ввожу с консоли еще до вызова CreateThread, т.е. в функции main. Но все-таки хочу разобраться с этой особенностью. Предлагаю код(тот, что проблемный):
Все в обычной консоли Win32. Может, у кого-то по-другому? |
| Автор: Romikgy 11.11.2009, 21:53 |
| скорее всего стандартным потоком ввода-вывода владеет основной поток, поэтому он первый символ съедает, имхо не красиво работать с такими потоками из программных потоков, вся работа должна оставаться в основном потоке , а обработка данных , там где хочешь ..... PS сорри за тавтологию |