Threads and CallCommands

  • On 22/05/2014 at 11:36, xxxxxxxx wrote:

    Is it possible to use a c4d.CallCommand() In A thread?

    Here is a small snipet of my code:

    import c4d,time
    from c4d import gui
    import socket
    class RB_Client(c4d.threading.C4DThread) :
        global Cthread
        def Main(self) :
            print "Before"
            c4d.CallCommand(12099) # Render to Picture Viewer
            print "After"
    global Cthread
    Cthread = RB_Client()

    This should send the current scene to render in the picture viewer, instead it is ignored/nothing happens. Any help on this would be great!

  • On 22/05/2014 at 14:40, xxxxxxxx wrote:

    No, it is not. The command would be executed in that other thread, too. Command plugins are 
    meant to be executed in the main thread.

    Take a look at "Call function from main thread".

  • On 27/05/2014 at 14:11, xxxxxxxx wrote:

    Would you happen to know if there are any example plugins that use the c4d.SpecialEventAdd()? Or if there is an alternate way to tell Cinema to start rendering from within a thread?


  • On 28/05/2014 at 01:43, xxxxxxxx wrote:

    I don't know of examples that do, but you'll get the ID you pass to SpecialEventAdd() 
    passed to the CoreMessage() method of a GeDialog or MessageData plugin.

    I would've told you if there is. ;)

    Btw, here's how I do it in the PV Render Queue plugin. I use the GeDialog.Timer()
    method to check if the renderer is still running, and if it is not, start a new rendering.
    No thread needed therefore.

        def Timer(self, msg) :
            rendering = c4d.CheckIsRunning(c4d.CHECKISRUNNING_EXTERNALRENDERING)
            if self.active_queue and not rendering:
                file\_ = None
                for file\_ in self.files:
                    if not file\_.done: break
                if file\_ and not file\_.done:
                    self.active_queue = False


  • On 28/05/2014 at 06:59, xxxxxxxx wrote:

    Thanks for the help Niklas.

Log in to reply