トップページ⇒tech
1001コメント319KB

C++Builder相談室 Part4

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさんNGNG
C++Builderに関する質問・回答や議論等を行う相談室スレッド。
過去スレ・関連サイトは>>2-4あたり。
0951933NGNG
TPoint Points[100];
int i;
const double PI = 3.1415926535;
double cosphi = cos(-rad/180.0*PI);
double sinphi = sin(-rad/180.0*PI);
double len,e,c;
if(a>b){
  len = b*b/a;           /* 線分CF */
   c = sqrt(a*a-b*b);       /* 焦点距離 */
  e = c/a;              /* 離心率 */
}
else{
  len = a*a/b;
  c = sqrt(b*b-a*a);
  e = c/b;
}
続く・・・
0952933NGNG
for(i=0;i<100;i++){
  double r,u,v;
  double theta = i/100.0*2.0*PI;
  if(a>b)
    r = len/(1-e*cos(theta));
  else
    r = len/(1-e*sin(theta));

   u = r*cos(theta);
   v = r*sin(theta);
   if(a>b){
    Points[i] = Point(
      u*cosphi-v*sinphi + X0+a-c,
       u*sinphi+v*cosphi + Y0+b
    );
  }
  else{
    Points[i] = Point(
      u*cosphi-v*sinphi + X0+a,
      u*sinphi+v*cosphi + Y0+b-c
    );
  }
}
Canvas->Polygon(Points,100);
終わり。
0953デフォルトの名無しさんNGNG
C++Builderでアイコン作りたいんですけどみなさんはどうゆうソフトを使っていますか?
0954デフォルトの名無しさんNGNG
>>953
ツール→イメージエディタを俺は使っている。
0955デフォルトの名無しさんNGNG
BCB_Update4の英語版を、化けないようにインストールする方法はありますか?
0956デフォルトの名無しさんNGNG
Update4をDLしてみたけど、この実行ファイルだめみたいだね。
実行してもすぐ終了してしまう。物が違うのかな。
Update2とUpdate3については英語版を日本語版にインストール
する方法がこのスレで書かれていたけど、Update4は実行ファイル
のアイコンからして違うからなあ。MS-DOSのアイコンになってる。
0957デフォルトの名無しさんNGNG
>>954
あれって糞じゃない?
ctrl+Zとかで色が化けるし。
0958デフォルトの名無しさんNGNG
ftp://ftpd.borland.com/devsupport/cbuilder/cb6/cp6_upd4_ent.exe
ftp://ftpd.borland.com/devsupport/cbuilder/cb6/cp6_upd4_pers.exe
ftp://ftpd.borland.com/devsupport/cbuilder/cb6/cp6_upd4_pro.exe

これダウンロードして適用できた方いらっしゃいます?Install Shieldが
立ち上がらなくて変なんですけど。
0959デフォルトの名無しさんNGNG
CommandButtonClickハンドラ内からCreateThreadを呼び出す
と、スレッドを2回起動すると保護エラーが出てしまいます。
VCLとCreateThreadは相性が悪いのでしょうか。
ちなみにCreateThreadで呼び出した関数からはDLLを呼んで
います。
0960デルファイの名無しさんNGNG
そのDLLが複数スレッドから呼ばれることに耐性が無いのでは?
中でグローバル変数使ってるとか。

DLL呼ぶ部分をクリティカルセクションで囲ってみるとか。
それと、VCLと併用するならBeginThreadの方がよさそうな気がします。
0961デフォルトの名無しさんNGNG
>>960
ありがとうございます。グローバル変数は使っていませんが、
DLL内でMessageBoxを呼んでいる事に原因がありそうです。
ちなみにCreateThreadを使わず、ButtonClickハンドラ内から
直接DLLを呼び出すとエラーになりません。

ButtonClickハンドラを複数作り、同時に呼び出してみたりして
みましたがどうもエラーが再現しません。CreateThreadとMessageBoxの
相性が悪いようです。DLLからMessageBoxを取り除くとエラーが
出なくなります。

BeginThreadでやってみます。
0962デフォルトの名無しさんNGNG
>>959
>>733-736を見る限りMessageBoxはスレッドセーフの様ですが。

> VCLまたはCLXのオブジェクト階層にあるオブジェクトを使用する場合は,
> そのプロパティおよびメソッドは, スレッドセーフであることが保証されていません。(開発者ガイドより)
この辺でまずいことやってない?
0963デフォルトの名無しさんNGNG
>>962
ButtonClick内では、CreateThreadで作成したスレッドを、
WaitForSingleObjectで終了を待つことしかしていません。
VCLは一切触れていません。
DLLでももちろんVCLは触っていません。というか、DLLは
M$互換で作成しています。

BeginThreadに置き換えようとしたのですが、返却値がint
であったりと、不可解な仕様に戸惑っています。これでは
WaitForSingleObjectが使えないのでどうすればいいんで
しょうか?素直にTThread使った方がいいのでしょうか?
0964デルファイの名無しさんNGNG
むう、不可解ですね。

とりあえず、BeginThreadの戻り値は「BeginThread は,Windows スレッドハンドルを返します。」と書かれてます。
Integerなのは、多分、Delphi側がTHandle(HANDLE) = LongWord(unsigned long)なので、
代入互換が有るからいいやみたいなてきとーな仕様が、C++Builderで皺寄せがきてるものと。
HANDLEにキャストして問題無いでしょう。
0965デフォルトの名無しさんNGNG
>>964
やってみました。やっぱり例外エラーが出ました(T_T)。
こうなると、同じメモリ空間内の関数をCreateObjectで呼んで
いる事による、スタック回りがスレッドセーフでない事に起因する
エラーしか考えられません。

思い切ってフォームを使わずに、コンソールとDLLだけで書いて
みてエラーが再現しないか試してみます。
0966デフォルトの名無しさんNGNG
extern "C" void __declspec(dllimport) __stdcall beep(WORD wCounter);

int main(int argc, char* argv[])
{
for (int i = 0; i < 5; i++) {
func();
Sleep(500);
}
}

void func()
{
HANDLE hThread;
DWORD threadID;
WORD beepTimes = 1;

hThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)beepThread,
(VOID *)beepTimes, 0, &threadID);
while (WaitForSingleObject(hThread, 0) == WAIT_TIMEOUT);
}
//---------------------------------------------------------------------------
void beepThread(WORD beepTimes)
{
beep(beepTimes);
}
0967デフォルトの名無しさんNGNG
extern "C" void __declspec(dllexport) __stdcall beep(WORD wCounter);

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
char szBuffer[256];
switch (fwdreason) {
case DLL_PROCESS_ATTACH:
lstrcpy(szBuffer, "プロセスがアタッチされました。");
break;
case DLL_THREAD_ATTACH:
lstrcpy(szBuffer, "スレッドがアタッチされました。");
break;
case DLL_THREAD_DETACH:
lstrcpy(szBuffer, "スレッドがデタッチされました。");
break;
case DLL_PROCESS_DETACH:
lstrcpy(szBuffer, "プロセスがデタッチされました。");
break;
}
MessageBox(NULL, szBuffer, "DLL entry point message", MB_OK);

return 1;
}
0968デフォルトの名無しさんNGNG
void __declspec(dllexport) __stdcall beep(WORD wCounter)
{
WORD loop;

for (loop = 0; loop < wCounter; loop++) {
Beep(400, 100);
Sleep(1000);
}
}

これがエラーを再現する最短のプログラムです。コンソールアプリケーション
でコンパイルして実行します。
0969デフォルトの名無しさんNGNG
>>962
MessageBox って Application.MessageBoxと Windows.MessageBox と2つあるから注意

APIのMessageBoxとして文字列はどうやって作ってるのかな
0970デフォルトの名無しさんNGNG
>>967 MODAL じゃない MessageBox って事は、
そのスレッドが終ったときにも その MessageBox は開いているんじゃないの?
0971デフォルトの名無しさんNGNG
SearchTreeForFileを使うと
「[C++ エラー] ImageHlp.h(600): E2015 'LONG64' と 'System::LONG64' の区別が曖昧」
ってエラーがでます。
これの解決方法を教えて下さい。
よろしくお願いします。
0972デフォルトの名無しさんNGNG
>>970
そのモーダルでないMessageBoxが開いているのが怪しいですよね。
これをモーダルにしてやってみようかな・・・・
0973デフォルトの名無しさんNGNG
というか 作業スレッドでMessageBoxを直接使う設計がまずマズイんじゃないの?
GUI関係はメインスレッドにお願いするような設計にするべきでしょう

エラーとかステータスは、DLLからコールバックさせて、コールバック内で
SendMessage/PostMessage するのが普通だと思うけどな
0974デフォルトの名無しさんNGNG
>>973
そうしましょうか・・・・これは本の例題を改造して作った物なのですが、
元々のプログラムの設計に難がありそうですね。

DLL内でGUIを使うのも可かと思ってたのですが・・・・・ケースバイケース
のようですね。
0975デフォルトの名無しさんNGNG
メッセージボックスを出してOKボタンなどをキーボードのEnterキーで押すと
ListViewのListViewKeyUpイベントが反応してしまいます。
これを防ぐ方法を教えて下さい。
宜しくお願いします。
0976デフォルトの名無しさんNGNG
Visual-C++のように、#pragma data_segを使って、DLL間でメモリを
共有するにはどのようにしたらよいのでしょうか?
0977デフォルトの名無しさんNGNG
C++Builderには#pragma data_segがないので困っています。
0978デフォルトの名無しさんNGNG
>>976-977
共有しなくたっていいよ。
おまえみたいなグローバル変数厨は氏ね。
0979デフォルトの名無しさんNGNG
>>978
何も知らないくせにグローバル変数厨などと言うな。
お前こそ氏ね!
0980名無しさんNGNG
ヽ(゚∀゚)ノアヒャヒャヽ(∀゚ )人(゚∀゚)人( ゚∀)人(∀゚ )人(゚∀゚)人( ゚∀)ノ
0981デフォルトの名無しさんNGNG
みんな氏ねー
0982デフォルトの名無しさんNGNG
>>979
アヒャhッヤアヤヤヤジャアヤジャアヤ
0983デフォルトの名無しさんNGNG
つうか>>975を教えてください
0984デフォルトの名無しさんNGNG
メッセージボックスをだした後に ActiveControl = NULL; としてみる
0985デフォルトの名無しさんNGNG
>>983
反応しませんよ。

void __fastcall TForm1::ListView1KeyUp(TObject *Sender, WORD &Key,
TShiftState Shift)
{
Application->MessageBox("ListViewKeyUpイベントです。", "", MB_OK);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
MessageBox(0, "MessageBoxです。", "", MB_OKCANCEL);
}
//---------------------------------------------------------------------------
0986デフォルトの名無しさんNGNG
>>985
それはButton1にフォーカスが移ったからだと思う。
0987デフォルトの名無しさんNGNG
>>986
その通り
0988デフォルトの名無しさんNGNG
ううむ確かにListViewClickにMessageBoxを出すルーチンを書いてみると
反応しますね。>>984さんの対策で直りました。
0989デフォルトの名無しさんNGNG
  /| +
  l |  989
  l | 
  _L!_
  ||   /二二ヽ
  || / (´Д`))
  Oニゝ、__乂__〉
  ||!J_|::::::::::::::|
  8  (二∧二)
0990デフォルトの名無しさんNGNG
>>976
どうしてもやりたいなら、アセンブラでセグメント指定して それをExternしてたら?
でも、共有するなら共有メモリよりメモリマップファイルのほうが楽じゃないの?
0991デフォルトの名無しさんNGNG
>>990
プロジェクトに.ASMを追加できたら楽ですね。やってみます。
だめならアセンブリ出力してTASMに掛けるかですね。
ありがとうございます。
0992たてたじょーNGNG
次スレ
http://pc2.2ch.net/test/read.cgi/tech/1045542179/l50
0993デフォルトの名無しさんNGNG
99999999999999999999
99999999999999999999
33333333333333333333
0994デフォルトの名無しさんNGNG
1000
0995デフォルトの名無しさんNGNG
埋め立て
0996デフォルトの名無しさんNGNG
ぬるぽ
0997名無しさんNGNG
997
0998名無しさんNGNG

998

0999名無しさんNGNG
999
1000名無しさんNGNG
1000
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。