私はかなり大きなオブジェクトを作成するWPFプロジェクト(VS2010
、 )を持っています(カスタムフォーマットファイルからの読み取り、情報の処理、メッシュの作成など)。これには約3〜4秒かかります。作成され、さらに2〜3秒。すること。これをすべてカスタム クラスで行い、次のメソッドを呼び出します。.NET4.0
ModelVisual3D
STL
mainViewport.Children.Add(ModelVisual3D)
class My3DModel
{
...
public MyModelVisual3D createModelVisual3D(MyTypes tType, int tNumber)
{
this.myModelVisual3D = new MyModelVisual3D(tType, tNumber);
for (int i = 0, j = 0; i < this.Triangles.Length; i++)
{
this.mesh.Positions.Add(this.Triangles[i].Vertex1);
this.mesh.Positions.Add(this.Triangles[i].Vertex2);
this.mesh.Positions.Add(this.Triangles[i].Vertex3);
this.mesh.Normals.Add(this.Triangles[i].Normal);
this.mesh.Normals.Add(this.Triangles[i].Normal);
this.mesh.Normals.Add(this.Triangles[i].Normal);
this.mesh.TriangleIndices.Add(j++);
this.mesh.TriangleIndices.Add(j++);
this.mesh.TriangleIndices.Add(j++);
}
this.model3DGroup.Children.Add(new GeometryModel3D(this.mesh, material));
this.myModelVisual3D.Content = this.model3DGroup;
return this.myModelVisual3D;
}
}
戻り値も、私が作成したカスタム クラスです。
class ToothModelVisual3D : ModelVisual3D
{
//VARIABLES
private MyTypes myType;
private int number;
//OPERATORS
public MyTypes MyType
{get { return myType; } set { myType = value; }}
public int Number
{get { return number; } set { number = value;}}
public ToothModelVisual3D() { }
public ToothModelVisual3D(MyTypes tType, int tNumber) { MyType = tType; Number = tNumber; }
}
私がやりたいのは、プログラムの最初に次の1回だけです。
{
My3DModel myModel;
myModel = new My3DModel();
myModel.readFileBytes("C:\\registered\\" + 1 + ".stl");
myModel.loadTriangles();
mainViewport.Children.Add(myModel.createModelVisual3D(MyTypes.Sometype, 1);
}
メイン スレッドで実行すると、UI がハングします。ワーカー スレッドで実行して呼び出すmainViewport.Children.Add(...)
と、そのワーカー スレッドで作成されたリソースにアクセスできないと表示されます。ヘルプ?!
私が理解していることから、2 つのスレッドとそれぞれに属するリソースがあるところまで来ました ( mainViewport => UIThread & myModel => WorkerThread
)。どちらのスレッドも他のリソースに直接アクセスできませんが、UIThread で myModel を作成して使用するとハングします... UI から十分な応答性を得たいだけなので、ユーザーはプログラムがモデルをロードするのを待っている間にプログラムを最小化できます、 これ以上何もない。どうやってやるの?UIThread ですべての CPU 負荷の高い作業を行う方法はありますか?リソースの競合が発生せず、その時間の UI のみを処理するワーカー スレッドを持つことはありませんか?
BackgroundWorker
PS:スレッドとTask<TResult>
クラスで試しました。同じとは言わないまでも、結果は似ていました。
PPS: フルバージョンでは、30 ~ 40 秒以上ロードされる大規模なモデルがロードされます...