| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Въпрос към Visual C програмистите. http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=773 |
Страница 1 от 1 |
| Автор: | Nikola Kirov [ Сря Юни 15, 2005 11:07 pm ] |
| Заглавие: | Въпрос към Visual C програмистите. |
Проблема е следния. Имам си една Dialog Bazed програма. И мамам пусната една допълнителна нишка на програмата която работи с Com-a. Искам от тази нищка да стартирам функция от класа на Диалоговия прозорец. Така и не можах да разбера как да стане. Ако нишката ми пусне Message и в диалога сложа функция дето да го обработва няма как да не стане,но ми се иска директно да си викна съответната функция. Възможно ли е? |
|
| Автор: | ¶ [ Чет Юни 16, 2005 12:12 am ] | |||||||||
| Заглавие: | Re: Въпрос към Visual C програмистите. | |||||||||
Не съм 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() е по-безопасна от гледна точка на синронизацията. |
||||||||||
| Автор: | Nikola Kirov [ Чет Юни 16, 2005 12:45 am ] |
| Заглавие: | |
Мерси за изчерпателното изложение. Значи интересува ме точно как да стане извикването с указател. Тази функция се ползва само от допълнителната нишка и няма странични проблеми. Пък ако се появят,има доста написано по въпроса за многонишковото програмиране в няколко книжки,ще почета и ще го излъжа. Но така и не успях да го измисля как да стане самото извикване. Повече от 2 часа борба с Студиото и така и не успях. |
|
| Автор: | tcsa35 [ Чет Юни 16, 2005 11:14 am ] |
| Заглавие: | |
в диалога 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:35 am ] |
| Заглавие: | |
Значи, ако ще рисуваш нещо по GUI-то, задължително пращаш съобщение. По принцип, за пращането има 2 ф-ии едната е SendMessage, другата е PostMessage, като разликата е, че първото е синхронно, а другото е асинхронно. Най-читаво е да вкараш някви данни в обекта и да викнеш Invalidate + UpdateWindow, за да се прерисува джама. |
|
| Автор: | Nikola Kirov [ Чет Юни 16, 2005 11:43 am ] |
| Заглавие: | |
Всъщност тая функция дето искам да извикам прави някои изчисления с аргументите си и разни променливи от класа на диалога и променя текста в няколко полета Static Text. Това задължително ли е да го правя с съобщение? |
|
| Автор: | Реконструктор [ Чет Юни 16, 2005 11:56 am ] |
| Заглавие: | |
Да, задължително. Значи сметките можеш да си ги направиш в нишката, да натъпчеш резултата в някви променливи и да Post-неш съобщението за опресняване. Тъй като никой не ти гарантира, че изрисуването на данните ще приключи при пристигането на следващата порция данни, е добре да сложиш Critical Section или дори само една променлива пак ще свърши работа. Все пак, ако комуникацията ти е бавна, няма нужда от тия мерки. |
|
| Автор: | Nikola Kirov [ Чет Юни 16, 2005 12:17 pm ] |
| Заглавие: | |
Ясно така и ще го направя. Ако не е много трудно за обяснение,би ли ми обяснил защо задължително трябва да е с съобщение. |
|
| Автор: | 0x00 [ Чет Юни 16, 2005 8:59 pm ] |
| Заглавие: | |
За да влезе в опашката със съобщения. А това се прави с цел обработката на сигнали към графичната система да става серийно, задача по задача. Иначе би могла да се получи ситуация в която, една манипулация по графичния контекст да започне преди предходното до е свършила. Изпалзва се механизма със съобщенията, защото по принцеп, всички обръщения към методи, работещи с графичния контекст, се правят така. Обработката на данни би могъл да я правиш в отделна, трета нишка, която да синхронизираш с комуникационната посредством Critical Sections, Mutexes или Events, зависи как ти харесва, а самата обработваща нишка да се обръща към GUI нишката посредством PostMessage() . Принципно се препоръчва да се прави по този начин, особено ако обработката на данни отнема повече време. |
|
| Автор: | Predator_MF [ Пет Авг 12, 2005 5:14 pm ] |
| Заглавие: | |
Аз имам един въпрос: Как да пренеса стринг или обект чрез SendMessage, имам само MSG, lParam и wParam ??? Гледах няколко примера, чрез WM_CopyData, но така и не схващам как става номера с тая функция PCopyDataStruct (никъде из хелпа на Borland C++ или Delphi не намирам описанието и) |
|
| Автор: | Реконструктор [ Пет Авг 12, 2005 5:31 pm ] |
| Заглавие: | |
В свойта програма ли ще го пращаш, или в друга? |
|
| Автор: | Predator_MF [ Пет Авг 12, 2005 5:33 pm ] |
| Заглавие: | |
И в мойта и в друга...Значи мернах един example за делфи, копи-пейст и заработи, направен е с TCopyDataStruct, съдържащ някаквъ dwData параметри, обаче никъде из нета или из хелповете не виждам какво прави тоя обект. Имам работещ код, само че незнам как работи |
|
| Автор: | Реконструктор [ Пет Авг 12, 2005 5:53 pm ] |
| Заглавие: | |
Ако се праща в друг процес, става сложно, така че се радвай на това, което имаш. |
|
| Автор: | Predator_MF [ Пет Авг 12, 2005 9:40 pm ] |
| Заглавие: | |
Значи искам комуникация на две мои програми чрез Messages, отделно в едната програма има нишка, която също праща/приема съобщения. Не е сложно, само че точно тоя код със CopyDataStruct никак не ми е ясен, а много голям мерак имам да разбера как работи PS Хах |
|
| Автор: | zaphod [ Вто Авг 16, 2005 8:09 pm ] |
| Заглавие: | |
бе комуникация със съобщения не съм пробвал, ама ми се струва че ако предадеш директно указател ще осереш пейзажа. трябва да си вземеш глобална памет, със GlobalAlloc и в нея да натъпчеш квото трябва. после предаваш указателя в някой от параметрите (имаш два) и си готов. |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|