<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Visual C++ 6.0 / .NET (unmanaged)</title><link>https://www.dotnetzone.gr:443/cs/forums/30/ShowForum.aspx</link><description>Για τους hardcore developers, C/C++ forum για windows εφαρμογές!</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: COM objects and Threads....</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/38067.aspx</link><pubDate>Fri, 07 Dec 2007 01:14:39 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:38067</guid><dc:creator>BruteForce</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/38067.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=30&amp;PostID=38067</wfw:commentRss><description>Κατ'αρχάς δεν είδα καμιά αναφορά στο COM+ στο αρχικό post, οπότε αναρωτιέμαι πώς προέκυψε.&lt;br&gt;Το COM+ είναι επέκταση του COM/DCOM συν δυνατότητες για resource management (διάβαζε transactions).&lt;br&gt;Απολύτως λογικό να λέγεται COM+ κατά τη γνώμη μου.&lt;br&gt;&lt;br&gt;Γενικά να παίζεις με COM objects και threads είναι living on the fast lane. Αν βάλεις τώρα και το DirectShow στην υπόθεση τότε είσαι έτοιμος να σου πάρουν μέτρα.&lt;br&gt;&lt;br&gt;Η CoInitialize(Ex) αυτό που κάνει είναι να δηλώνει στο COM+ runtime το threading model του thread και ΜΟΝΟ.&lt;br&gt;Δηλαδή σε ποιό "COM apartment" θα ζει το thread και ΜΟΝΟ.&lt;br&gt;Το σε ΠΟΙΟ apartment θα ζήσουν τα COM objects που δημιουργεί το thread, εξαρτάται από το threading model των COM objects, και εν μέρει του creator.&lt;br&gt;&lt;br&gt;Υπάρχει ΕΝΑ multithreaded apartment (MTA) και όσα θες single threaded apartments (STA).&lt;br&gt;&lt;br&gt;Από εκεί και πέρα, όταν ένα DLL COM object είναι SingleThreaded τότε πάει πάντα σε ένα STA. Αν ο creator του είναι STA thread, τότε πάει στο apartment του creator. Αν ο creator είναι στο MTA, τότε φτιάχνεται ένα STA apartment για να ζήσει το COM object.&lt;br&gt;Ένα DLL COM Object που έχει threading model BOTH πάει εκεί που είναι ο creator του.&lt;br&gt;&lt;br&gt;Τώρα τα πράγματα σκουραίνουν όταν καλείς COM objects τα οποία θα σε καλέσουν πίσω ή κάνουν hook τα COM events σου και σε καλούν και τα καλείς κλπ κλπ. Είναι πολύ εύκολο να προκύψει deadlock σε αυτές τις περιπτώσεις. Το βασικό πάντως είναι ότι για να κάνει δεχτεί ένα COM object σε STA apartment μία κλήση (method call) πρέπει το thread του STA να είναι διαθέσιμο να κάνει pump ένα κρυμμένο message loop μέσα στο COM. Αν αυτό το thread είναι blocked περιμένοντας κάτι, τότε τα ρολλά είναι κατεβασμένα. Εκεί χρησιμεύει η μαγική MsgWaitForMultipleObjects για να φτιάξεις δικό σου message pump. Όταν τη χρειαστείς θα καταλάβεις τι κάνει.&lt;br&gt;&lt;br&gt;Ένα πανεύκολο deadlock είναι αν πας να κάνεις διάφορα non-trivial πράγματα μέσα από μια DirectShow callback.&lt;br&gt;Anyway, αν έχεις ακόμα πρόβλημα, let me know.&lt;br&gt;</description></item><item><title>Απ: COM objects and Threads....</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/36929.aspx</link><pubDate>Sat, 03 Nov 2007 12:26:06 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:36929</guid><dc:creator>odyodyodys</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/36929.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=30&amp;PostID=36929</wfw:commentRss><description>Ναι συγνώμη, Initialize εννοούσα..&lt;br&gt;&lt;br&gt;Το θέμα μου είναι ότι είτε καλέσω CoInitializeEx με σημαία για multithreading μόνο στο κυρίως thread είτε CoInitializeEx με σημαία για το thread και το καλέσω στο κάθε thread ξεχωριστά, έχω προβλήματα...&lt;br&gt;(Εννοείται ότι πριν το κλείσιμο κάθε thread έχω CoUninitialize() )&lt;br&gt;&lt;br&gt;Όσο για βιβλία της Com, έχω ένα, αλλά δεν αναφέρει τίποτα παραπάνω από αυτα..&lt;br&gt;&lt;br&gt;Ευχαριστώ πάντως... &lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-4.gif" alt="Stick out tongue" /&gt;&lt;br&gt;</description></item><item><title>Απ: COM objects and Threads....</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/36924.aspx</link><pubDate>Sat, 03 Nov 2007 04:51:18 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:36924</guid><dc:creator>Νατάσα Μανουσοπούλου</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/36924.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=30&amp;PostID=36924</wfw:commentRss><description>&lt;P&gt;Όπως πολύ σωστά σου είπε κι ο Παναγιώτης, πρέπει να καλέσεις την CoInitializeEx σε κάθε thread που ανοίγεις, η οποία στο τέλος του πρέπει να συνοδεύεται και από το αντίστοιχο CoUninitialize. Αν την καλέσεις όπως στο post σου, με COINIT_MULTITHREADED, τότε τα αντικείμενα που θα φτιάξεις θα ζουν στο multithreaded apartment του COM, πράγμα που σημαίνει ότι μπορούν να "δέχονται" κλήσεις από πολλά threads ταυτόχρονα.&lt;/P&gt;</description></item><item><title>Απ: COM objects and Threads....</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/36911.aspx</link><pubDate>Fri, 02 Nov 2007 22:47:51 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:36911</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/36911.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=30&amp;PostID=36911</wfw:commentRss><description>&lt;P&gt;Μετέφερα εδώ την ερώτηση σου γιατί το COM+ δεν έχει σχέση με το DirectShow. Το COM+ είναι τεχνολογία καθαρά για transaction management και distributed εφαρμογές. Τώρα, θα μου πεις γιατί το ονομάσανε COM+? Άλλη μία ατυχής ονομασία από το marketing της Microsoft.&lt;/P&gt;
&lt;P&gt;Όσον αφορά την ερώτηση σου ... ομολογώ ότι δεν πολυκατάλαβα τί ρωτάς. Όταν λες "εγκαθιστώ" εννοείς Initialize? Οπότε η ερώτηση σου είναι "Πως κάνω initialize το COM σε διαφορετικά threads?". Απ' όσο θυμάμαι, το COM πρέπει να το κάνεις Initialize σε κάθε thread που θα το χρησιμοποιήσει, όχι μόνο στο κυρίως thread. Από εκεί και πέρα ... δεν έχω ασχοληθεί παραπάνω με COM και multithreading. Είναι εξαιρετικά δύσκολο μανίκι να το κάνεις μόνος σου και θέλει διάβασμα. Το ATL Library της Visual C++ μπορεί να βοηθήσει πάντως. &lt;/P&gt;
&lt;P&gt;Γιατί δεν χρησιμοποιείς τις αντίστοιχες κλάσεις του .NET για DirectX? Το multithreading είναι πολύ ευκολότερο εκεί, άσε που για COM δεν πρόκειται πλέον να βρεις και πολλά βιβλία ή άρθρα.&lt;/P&gt;</description></item><item><title>COM objects and Threads....</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/36908.aspx</link><pubDate>Fri, 02 Nov 2007 21:58:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:36908</guid><dc:creator>odyodyodys</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/36908.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=30&amp;PostID=36908</wfw:commentRss><description>Γεια σας,&lt;br&gt;&lt;br&gt;Είμαι νέο μέλος του dotNETZone και ελπίζω αυτό το άρθρο να το έβαλα στο σωστό μέρος...&lt;br&gt;&lt;br&gt;Έχω μία εφαρμογή που χρησιμοποιεί το DirectShow για να παίζει video (Video Player).&lt;br&gt;Η εφαρμογή τρέχει 3 φορές ταυτόχρονα (διαφορετικά video σε 3 οθόνες)
και την διαχείριση τους την έχει ένα άλλο πρόγραμμα που απλώς τα
ξεκινάει.&lt;br&gt;Το πρόβλημά μου είναι ότι η εφαρμογή χρησιμοποιεί 3 threads και τα 2 από αυτά χρειάζονται τα COM αντικείμενα....&lt;br&gt;&lt;br&gt;Το κύριο Thread του process (t1) και ένα thread που δημιουργεί αυτό (t2).&lt;br&gt;Δεν μπορώ να καταλάβω που και πως πρέπει να εγκαθιστώ την COM. &lt;br&gt;&lt;br&gt;Δοκίμασα..&lt;br&gt;CoInitialize(NULL); στο t1.&lt;br&gt;Αλλά δεν μπορεί να δημιουργήσει αντικείμενα το t2.&lt;br&gt;&lt;br&gt;CoInitializeEx(NULL,COINIT_MULTITHREADED); στο t1.&lt;br&gt;Μπορεί να δημιουργήσει COM αντικείμενα και το άλλο thread αλλά αποτυγχάνει να ξεκινήσει 2η φορά η εφαρμογή...&lt;br&gt;&lt;br&gt;Χρειάζομαι επειγόντος βοήθεια...!!&lt;br&gt;&lt;br&gt;&lt;br&gt;</description></item></channel></rss>