Hello,

This is my first time on any mailing list so please advise me if I'm doing 
something wrong.

For some reason (I'm porting a low level C++ window management library on mac) 
I cannot use NSApplicationMain nor NSApplication -run method. So I create a 
function to dispatch NSEvent working like this :

loop begin (non infinite)
[NSApp nextEventMatchingMask:blabla..]
[NSApp sendEvent:..]
loop end

And I call it periodically. Until now it worked pretty well (the window is 
displayed, key/mouse event are dispatched, ...) – I was only using main thread.

But now I'm stuck with a problem : is there any way to create/destroy 
window/view, make them live (e.g. rendering process) and get event 
notification; all that only in a worker thread (like we can do on Linux or 
Windows) ?

From what I've read in the doc the NSWindow can be created/destroyed in any 
thread but this is not true for NSView. So I though of using NSObject 
-performSelectorOnMainThread:..-like methods. But, again, the documentation is 
against me :

> This method queues the message on the run loop of the main thread using the 
> default run loop modes—that is, the modes associated with the 
> NSRunLoopCommonModes constant. As part of its normal run loop processing, the 
> main thread dequeues the message (assuming it is running in one of the 
> default run loop modes) and invokes the desired method.

And I tested : if I call some dummy function like this in a worker thread 
nothing happen (as expected) :

-(void)dummy:(NSString *)msg
{
   NSLog(@"Hello %@", msg);
}

-(id)initWithStuff:...
{
   if ((self = [super init])) {
       [self performSelectorOnMainThread:@selector(dummy:)
                              withObject:@"World"
                           waitUntilDone:YES];
:
:
}

It get stuck forever in performSelectorOnMainThread:.. because the selector is 
never executed. Of course, I could set waitUntilDone to NO but later I will 
require to wait for my view to be initialized.

So have any of you an idea of how to make it work ? Or is it really impossible 
? One idea that crossed my mind was to call some method in the main thread 
periodically but that would require to change the public API of the library... 
which is not an option for me. The only thing I can do is play in some GetEvent 
and Display functions called by the user in the worker thread. You can see 
below what should the lib-user be able to do.

#include <SFML/Window.hpp>

sf::Window App;

void threadProc() { 
   App.Create(sf::VideoMode(800, 600, 32), "SFML Threads");

   // Create the main window // Start main loop 
   while (App.IsOpened()) {
       // Process events 
       sf::Event Event; 
       while (App.GetEvent(Event)) { 
           // Close window : exit 
           if (Event.Type == sf::Event::Closed) 
               App.Close(); 

           // Escape key : exit 
           if (Event.Type == sf::Event::KeyPressed && Event.Key.Code == 
sf::Key::Escape) 
               App.Close(); 
       }

       // Display window on screen 
       App.Display();
   } 
}

int main(int, char**) 
{
   sf::Thread Thread(threadProc); 
   Thread.Launch();
   Thread.Wait();

   return 0; 
} 

This C++ code display a window with white titlebar and a spinning wheel.


The only thing that is working is rendering stuff from a worker thread works! 
(Also as expected by the documentation.)

And if it can be done to work so I'll have some other trouble with event 
dispatching... arg!


If you need any other information please tell me.
Thank you very much for your time =)

Marco
_______________________________________________

Cocoa-dev mailing list ([email protected])

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to