Отговори на тема  [ 15 мнения ] 
Въпрос към Visual C програмистите. 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение Въпрос към Visual C програмистите.
Проблема е следния.
Имам си една Dialog Bazed програма. И мамам пусната една допълнителна нишка на програмата която работи с Com-a.
Искам от тази нищка да стартирам функция от класа на Диалоговия прозорец.
Така и не можах да разбера как да стане.
Ако нишката ми пусне Message и в диалога сложа функция дето да го обработва няма как да не стане,но ми се иска директно да си викна съответната функция. Възможно ли е?


Сря Юни 15, 2005 11:07 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение Re: Въпрос към Visual C програмистите.
Nikola Kirov написа:
Проблема е следния.
Имам си една Dialog Bazed програма. И мамам пусната една допълнителна нишка на програмата която работи с Com-a.
Искам от тази нищка да стартирам функция от класа на Диалоговия прозорец.
Така и не можах да разбера как да стане.
Ако нишката ми пусне Message и в диалога сложа функция дето да го обработва няма как да не стане,но ми се иска директно да си викна съответната функция. Възможно ли е?


Не съм Visual C програмист, но ето какво мога да кажа:
Ако съответната функция не се извиква от друга нишка всичко е наред. Ако се извиква и от друга нишка ти трябва синхронизация, за да може в един момент само една нишка да извиква дадената функция. При Borland C++ се използва обект от типа на TEvent. При MicroSoft трябва да е CEvent. Може и със семафори или CRITICAL_SECTION.
Ако те интересува как по-точно да извикаш съответната функция, то това става чрез глобален указател към обекта на Диалоговия ти прозорец, или когато създаваш треда на серийния канал да му подадеш като параметър pointer или reference към обекта на диалоговия прозорец.
Във всички случаи трябва да помислиш за синхронизацията при приключване на работата на нишките. В твоя случай, главната нишка е тази на Диалоговия прозорец, която трябва преди да върне управлението на ОС, да изчака да приключи работа нишката на серийния канал ( или която и да е стартирана от нея друга нишка ), ако нишката на серийния канал се е отвяла , трябва да изчака определено време след което да я унищожи ( има си API функция за това ). Имай предвид, че насилственото унищожаване на нишка във всички версии на Windows предизвиква memory leakage, мисля че беше около 4к ( MicroSoft твърдят, че това е коригирано в Windows NT базираните им версии, но от опита си знам, че не е така. Имам една програма, която я бях така проектирал, че през 1 секунда създава и унищожава помощна нишка, която изчертава обекти в потребителската област, след няколко дена работа на Win98, WinNT, 2000 & XP паметта на машината изчезваше яко дим, при положение че работи само мойта програма. Премахнах този код с нишките като го направих с таймер и програмата си заработи коректно ).
В Borland C++ Builder има специална функция Syncronize() която се използва за синхронизация на функции и данни дефинирани в една нишка от други нишки. Би трябвало и при MicroSoft да има такава.

П.П.
Ако пускаш message, можеш по два начина да го пуснеш: SendMessage(), която извиква Windows процедурата на указания прозорец и докато не се обработи това съобщение не връща у-ето ( викащата нишка се блокира );
PostMessage() поставя message в опашката за съобщения на съответния прозорец и веднага връща управлението ( викащата нишка не се блокира ).
SendMessage() е по-безопасна от гледна точка на синронизацията.


Чет Юни 16, 2005 12:12 am
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Мерси за изчерпателното изложение.
Значи интересува ме точно как да стане извикването с указател.
Тази функция се ползва само от допълнителната нишка и няма странични проблеми. Пък ако се появят,има доста написано по въпроса за многонишковото програмиране в няколко книжки,ще почета и ще го излъжа.
Но така и не успях да го измисля как да стане самото извикване. Повече от 2 часа борба с Студиото и така и не успях.


Чет Юни 16, 2005 12:45 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Сря Ное 10, 2004 4:03 pm
Мнения: 111
Местоположение: София
Мнение 
в диалога
in .h CCommClass *Comm; //member

in .cpp Comm = new CCommClass ();
Comm->m_pMyDlg = this;
стартираш thread-a

в thread-a
in .h CMyDlg* m_pMyDlg; // member

in .cpp if(m_pMyDlg)
m_pMyDlg->CallDlgFunc();

това в общи линии, е требва да се оправят инициализациите и да внимаваш за синхонизации ако има повече thread-ве.


Чет Юни 16, 2005 11:14 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
Значи, ако ще рисуваш нещо по GUI-то, задължително пращаш съобщение. По принцип, за пращането има 2 ф-ии едната е SendMessage, другата е PostMessage, като разликата е, че първото е синхронно, а другото е асинхронно. Най-читаво е да вкараш някви данни в обекта и да викнеш Invalidate + UpdateWindow, за да се прерисува джама.


Чет Юни 16, 2005 11:35 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Всъщност тая функция дето искам да извикам прави някои изчисления с аргументите си и разни променливи от класа на диалога и променя текста в няколко полета Static Text.
Това задължително ли е да го правя с съобщение?


Чет Юни 16, 2005 11:43 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
Да, задължително. Значи сметките можеш да си ги направиш в нишката, да натъпчеш резултата в някви променливи и да Post-неш съобщението за опресняване. Тъй като никой не ти гарантира, че изрисуването на данните ще приключи при пристигането на следващата порция данни, е добре да сложиш Critical Section или дори само една променлива пак ще свърши работа. Все пак, ако комуникацията ти е бавна, няма нужда от тия мерки.


Чет Юни 16, 2005 11:56 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Ясно така и ще го направя.
Ако не е много трудно за обяснение,би ли ми обяснил защо задължително трябва да е с съобщение.


Чет Юни 16, 2005 12:17 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пет Мар 18, 2005 4:14 pm
Мнения: 67
Местоположение: Русе.BG/Oldenburg.DE
Мнение 
За да влезе в опашката със съобщения. А това се прави с цел обработката на сигнали към графичната система да става серийно, задача по задача. Иначе би могла да се получи ситуация в която, една манипулация по графичния контекст да започне преди предходното до е свършила. Изпалзва се механизма със съобщенията, защото по принцеп,
всички обръщения към методи, работещи с графичния контекст, се правят така.

Обработката на данни би могъл да я правиш в отделна, трета нишка, която да синхронизираш с комуникационната посредством Critical Sections, Mutexes или Events, зависи как ти харесва, а самата обработваща нишка да се обръща към GUI нишката посредством PostMessage() . Принципно се препоръчва да се прави по този начин, особено ако обработката на данни отнема повече време.


Чет Юни 16, 2005 8:59 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Аз имам един въпрос: Как да пренеса стринг или обект чрез SendMessage, имам само MSG, lParam и wParam ??? Гледах няколко примера, чрез WM_CopyData, но така и не схващам как става номера с тая функция PCopyDataStruct (никъде из хелпа на Borland C++ или Delphi не намирам описанието и)


Пет Авг 12, 2005 5:14 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
В свойта програма ли ще го пращаш, или в друга?


Пет Авг 12, 2005 5:31 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
И в мойта и в друга...Значи мернах един example за делфи, копи-пейст и заработи, направен е с TCopyDataStruct, съдържащ някаквъ dwData параметри, обаче никъде из нета или из хелповете не виждам какво прави тоя обект. Имам работещ код, само че незнам как работи :lol:


Пет Авг 12, 2005 5:33 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
Ако се праща в друг процес, става сложно, така че се радвай на това, което имаш. :)


Пет Авг 12, 2005 5:53 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Значи искам комуникация на две мои програми чрез Messages, отделно в едната програма има нишка, която също праща/приема съобщения. Не е сложно, само че точно тоя код със CopyDataStruct никак не ми е ясен, а много голям мерак имам да разбера как работи :D

PS Хах :D Намерих го точно там където най-малко очаквах...в сайта на Microsoft 8O Сега ми се разясни :D


Пет Авг 12, 2005 9:40 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юли 24, 2005 10:28 am
Мнения: 2658
Мнение 
бе комуникация със съобщения не съм пробвал, ама ми се струва че ако предадеш директно указател ще осереш пейзажа. трябва да си вземеш глобална памет, със GlobalAlloc и в нея да натъпчеш квото трябва. после предаваш указателя в някой от параметрите (имаш два) и си готов.


Вто Авг 16, 2005 8:09 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 15 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни