wxSocketBase is the base class for all socket-related objects, and it
defines all basic IO functionality.
+Note: (Workaround for implementation limitation for wxWidgets up to 2.5.x)
+If you want to use sockets or derived classes such as wxFTP in a secondary thread,
+call wxSocketBase::Initialize() (undocumented) from the main thread before creating
+any sockets - in wxApp::OnInit for example.
+See http://wiki.wxwidgets.org/wiki.pl?WxSocket or
+http://www.litwindow.com/knowhow/knowhow.html for more details.
+
\wxheading{Derived from}
\helpref{wxObject}{wxobject}
{
if ( !m_countInit++ )
{
+#ifdef __WXMSW__
+ /*
+ The following asserting might be neccessary for linux as well,
+ but I cannot verify this.
+ */
+ wxASSERT(wxThread::IsMain(),
+ wxT("To use sockets in a secondary thread, ")
+ wxT("call wxSocketBase::Initialize() from the main thread."));
+ /*
+ Details: Initialize() creates a hidden window as a sink for socket
+ events, such as 'read completed'. wxMSW has only one message loop
+ for the main thread. If Initialize is called in a secondary thread,
+ the socket window will be created for the secondary thread, but
+ since there is no message loop on this thread, it will never
+ receive events and all socket operations will time out.
+ BTW, the main thread must not be stopped using sleep or block
+ on a semaphore (a bad idea in any case) or socket operations
+ will time out.
+ */
+#endif
wxAppTraits *traits = wxAppConsole::GetInstance() ?
wxAppConsole::GetInstance()->GetTraits() : NULL;
GSocketGUIFunctionsTable *functions =