Solved How to break render thread and get the result without state bar ?

My test environment:
Cinema 4D version: CINEMA 4D R19.068
Renderer: Octane renderer 3.07 R2

This is my code:

# -*- coding: UTF-8 -*-
import c4d
from time import sleep


# Save path
save_path = "D:\\temp"  # It's my dir for test. Change it if you dont want to save your bmp at here.


class RenderThread(c4d.threading.C4DThread):
    global save_path
    
    # Override
    def __init__(self, doc, rd, bmp):
        self.break_flag = False
        self.doc = doc
        self.rd = rd
        self.bmp = bmp
        self.res = None
        
    # Override
    def Main(self):
        self.res = c4d.documents.RenderDocument(
            self.doc,
            self.rd,
            self.bmp,
            c4d.RENDERFLAGS_EXTERNAL
        )
        
        # Just a test for distinguish the result file is saved by which thread.
        # If i get this file, it indicates that the render thread has run completed.
        if self.res == c4d.RENDERRESULT_OK:
            self.bmp.Save(
                "{}\\RenderThread_SaveResult.jpg".format(save_path),
                c4d.FILTER_JPG
            )

    # Override
    def TestDBreak(self):
        return self.break_flag


# This method is main thread.
def main():
    global save_path
    
    doc = c4d.documents.GetActiveDocument()
    rd = doc.GetActiveRenderData().GetData()
    bmp = c4d.bitmaps.BaseBitmap()
    bmp.Init(rd[c4d.RDATA_XRES], rd[c4d.RDATA_YRES])
    
    th = RenderThread(doc, rd ,bmp)
    th.Start()

    count = 0  # When "count" equals 10, end render thread.
    while True:
        print "Current count ->", count

        # Show bmp to picture viewer
        c4d.CallCommand(430000740, 430000740) # Remove All Images --> Clear history, just show current bmp
        c4d.CallCommand(430000774, 430000774) # Auto Zoom Mode --> Zoom picture to fit the picture viewer
        c4d.bitmaps.ShowBitmap(bmp)

        # Listen for the running state of the render thread.
        is_run = th.IsRunning()
        print "Is render thread running ->", is_run
        
        if not is_run:
            print "End Render Thread"
            
            # If i get this file, it indicates that the render thread has run completed.
            if th.res == c4d.RENDERRESULT_OK:
                th.bmp.Save(
                    "{}\\MainThread_SaveResult.jpg".format(save_path),
                    c4d.FILTER_JPG
                )
            
            break

        # Test of break render thread
        if count == 10:
            print "Break Render Thread"

            th.break_flag = True
            break_res = th.TestBreak()

            print "TestBreak() result ->", break_res

            if break_res:
                th.End(False)  # It doesn't work... and the bottom of result image have a state bar... 
                print "Execute End()..."
            
            print "Is render thread still running ->", th.IsRunning()
            
            # If i get this file, it indicates that the render thread has break.
            th.bmp.Save(
                "{}\\Break_SaveResult.jpg".format(save_path),
                c4d.FILTER_JPG
            )

            break

        count += 1
        sleep(1)


if __name__ == "__main__":
    c4d.CallCommand(13957) # Clear Console
    main()

There has two questions:

  1. In fact, render thread is not break... this is my c4d console log:
    After "End()" has executed, render thread is still running...
    Emmmm... how to really end render thread ?

log.jpg

  1. I got a image after "End()", but the image has a state bar at bottom...
    So, can I get the image without state bar when I break render thread ?
    This is the image:

Break_SaveResult.jpg

Finally, I will got two images, because render thread doesn't break:
results.jpg

Hi,

You end the thread, but you use false as an argument meaning that you don't wait, that's why it's still running if you ask immediately after.

The question about the status at the bottom, i would say that octane does override that part of the frame until the render is finished. But that's just a guess, you should ask the devs from Otoy about that on their forum.

Cheers,
Manuel

MAXON SDK Specialist

MAXON Registered Developer

Hi,

You end the thread, but you use false as an argument meaning that you don't wait, that's why it's still running if you ask immediately after.

The question about the status at the bottom, i would say that octane does override that part of the frame until the render is finished. But that's just a guess, you should ask the devs from Otoy about that on their forum.

Cheers,
Manuel

MAXON SDK Specialist

MAXON Registered Developer

Hello @Артём,

we will set this topic to 'Solved' when there are no further questions or replies until Monday, November the 22th.

Thank you for your understanding,
Ferdinand

MAXON SDK Specialist
developers.maxon.net