Well, it is exactky what is says:
Control 'frm_splash' accessed from a thread other than the thread it was created on
It was created on the UI thread in your frm_billingMain constructor:
this.splashScreen = new frm_splash();
And you are using it in
ShowSplashScreen which is called in a separate thread:
Thread thread = new Thread(new ThreadStart(this.ShowSplashScreen));
thread.Start();
You can't access controls from any thread other than the UI thread they were created on.
You could use Invoke to get round this, but in all honesty I'd dump most of that code as "not a good idea". Any time you end up using Application.DoEvents it normally means there is a real problem with your code, and to use it in a threaded environment means there is something seriously wrong.
I would start by looking at some of the many articles here on splash screens:
Google splash screens on CodeProject[
^] and see how they do it - you are over complicating things a lot! :laugh: