2015年11月16日月曜日

MFCマルチスレッド作成方法

MFCでマルチスレッドを作成する方法をよく忘れてしまいます。
毎回調べるのが面倒なので記述しておきます。
(Visual Studio 6.0版)

(1)Thread_smpDlg.cpp : OnInitDialog() の中に追加する

BOOL CThread_smpDlg::OnInitDialog()
{

// TODO: 特別な初期化を行う時はこの場所に追加してください。
// ■↓ここから追加
ThreadInit();
 // ■↑ここまで
return TRUE;  // TRUE を返すとコントロールに設定したフォーカスは失われません。
}


(2)Thread_smpDlg.h : の protected: の下に追加する

protected:
HICON m_hIcon;

// ■↓ここから追加
private:
//-----------------------------
// テーブル宣言
//-----------------------------
HANDLE m_hEventStop;
CWinThread* m_pThread;

//-----------------------------
// スレッドエントリー
//-----------------------------
static UINT ThreadEntry(LPVOID pParam)
{
    CThread_smpDlg* pHogeHoge = (CThread_smpDlg*)pParam; // 自オブジェクトの取得
   
    return pHogeHoge->ThreadProc(); // スレッド処理
}
//-----------------------------
// スレッド処理
//-----------------------------
UINT ThreadProc(void)
{
    // 終了イベントがセットされるまでループ
    while ( ::WaitForSingleObject(m_hEventStop, 0) == WAIT_TIMEOUT )
    {
// ■ここに処理を書く
    }
    return 0;
}
//-----------------------------
// スレッド初期化
// OnInitDialog() からコールする
//-----------------------------
void ThreadInit()
{
    m_hEventStop = ::CreateEvent(NULL, TRUE, FALSE, NULL);
    m_pThread = NULL; // スレッドオブジェクトのポインタクリア

    ASSERT(m_pThread == NULL);
   
    // サスペンド状態でスレッドを作成
    m_pThread = ::AfxBeginThread(ThreadEntry, (LPVOID)this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL);
    m_pThread->m_bAutoDelete = FALSE; // 自動破棄フラグクリア
    m_pThread->ResumeThread(); // サスペンド解除
}
 // ■↑ここまで

2015年6月20日土曜日

AVR ブートプログラム用のリンカー設定方法

Atmel Studio AVR bootloader
CPU : ATxmega256A3BU

ブートプログラムを自作する場合、生成されるHEXファイルは
ブート部に書込むようにしねければなりません。


ブートプログラム用のリンカー設定方法を ATxmega256A3BU を例に示します。


Atmel Studio の [Project]メニューの[**Properties]を開き以下を設定します。

    [Toolchain]->[AVR/GNU Linker]->[Memory Settings]->[FLASH segment]

    [Add Item](緑十字アイコン)をクリックし以下を入力します。

    .text=0x20000


ATxmega256A3BU のブート部は 0x40000 ですが .text=0x20000 になることに注意しましょう。

2015年6月5日金曜日

テキストボックスを軽くする方法 (C#,C++/CLI)

シリアル通信プログラムなどで受信内容をテキストボックスに表示するとき
appendText を使うと 20,000 バイトくらいから表示がかなり重くなります。

テキストボックスを軽くする方法は、プロパティで以下に設定すると軽くなります。

   WordWrap = False

簡単ですね。

2015年5月14日木曜日

「GDI+ で汎用エラーが発生しました。」回避方法 (C++/CLI)

以下のプログラムではエラーが発生します。

Bitmap^ b1 = gcnew Bitmap("C:\\tmp.png");
Bitmap^ b2 = gcnew Bitmap(b1->Width, b1->Height);
Graphics^ g = Graphics::FromImage(b2);
g->DrawImage(b1, 0, 0, b1->Width, b1->Height);
b2->Save("C:\\tmp.png", System::Drawing::Imaging::ImageFormat::Png);

原因は、同一ファイル名でセーブしようしましたが、b1 がファイルオープンのままになっているからです。

b1 を解放すればエラーは回避できます。

Bitmap^ b1 = gcnew Bitmap("C:\\tmp.png");
Bitmap^ b2 = gcnew Bitmap(b1->Width, b1->Height);
Graphics^ g = Graphics::FromImage(b2);
g->DrawImage(b1, 0, 0, b1->Width, b1->Height);
delete b1;
b2->Save("C:\\tmp.png", System::Drawing::Imaging::ImageFormat::Png);

2015年4月4日土曜日

ローカル環境にアクセスすると、ダウンロード画面になってしまう。

xampp の htdocsフォルダのファイルをいろいろ修正しているうちに localhost の php が起動しなくなり毎回ダウンロード画面の表示が出るようになってしまいました。

php だけではなく http://localhost/index.html もダメでダウンロード画面が出ます。

しかしなぜか、http;//localhost/phpmyadmin/ は正常に起動しました。



やったことを思い出していろいろ試してみると治りました。

どうやら htdocs にある .htaccess が悪さをしていたようです。

ファイル名を a.htaccess などに変更すると php が正常に起動するようになりました。



2015年3月9日月曜日

VC++2005 で C言語ソースをコンパイルする方法


VC++2005 で C言語ソースをコンパイルする方法

C言語のプログラムをデバックしたいけど実機やデバッカーが無かったりしてデバックできないことあります。
VC++6.0であれば以下の①を行うとコンパイルが通るのですが VC++2005だとコンパイルが通りませんでした。
しかし、②を行えばコンパイルできるようになりました。

①プリコンパイル済みヘッダーの作成/使用 -> プリコンパイル済みヘッダーを使用しない

②C言語のソースは、拡張子を[.h]にし、 namespace と extern "C" を追加する。


例)プロジェクト名 "Mypro" とし、Form に button1 と textbox1 を配置し、
  button1 をクリックすると C言語のソースである sample.h でセットした文字列を textbox に表示するというプログラムです。

--------------------------
[ sample.h ]
--------------------------
namespace Mypro {               // namespace を追加( Mypro はプロジェクト名 )

  extern "C" {                  // extern "C" を追加

    char abab[] = "aaaa";

    char* sub(){
      return (char*)&abab;
    }
  }
}
--------------------------
[ Form1.h の抜粋 ]
--------------------------
  private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {

    char* buf = sub();

    this->textBox1->Text = System::Runtime::InteropServices::Marshal::PtrToStringAnsi((IntPtr)buf);

  }